C# 为什么在c中,将对象强制转换为具有相同值的T类型的对象是';你不认识同样的人吗?
我正在学习泛型,但有一点我不明白,我在这门课上C# 为什么在c中,将对象强制转换为具有相同值的T类型的对象是';你不认识同样的人吗?,c#,generics,C#,Generics,我正在学习泛型,但有一点我不明白,我在这门课上 class Node<T>{ T value; Node <T> next,prev; public Node(T vl) { this.value=vl; this.next=this.prev=null; } } 问题是,对于valuetypes例如int,在您的示例中,您是通
class Node<T>{
T value;
Node <T> next,prev;
public Node(T vl)
{
this.value=vl;
this.next=this.prev=null;
}
}
问题是,对于valuetypes例如
int
,在您的示例中,您是通过强制转换到对象来对它们进行装箱。
默认情况下,=
操作符执行ReferenceEquality,这意味着在您的情况下它将永远不会返回true,因为框从来都不相同
最简单的方法就是改变这条线
while (tmp != null && ((object)tmp.VL != (object)vl)) tmp = tmp.next;
进入这个
while (tmp != null && !Equals(tmp.VL , vl)) tmp = tmp.next;
这将对特定类型使用默认的相等比较器,并使代码按预期工作
您可以进一步使用为类声明的泛型约束,如下所示:
class Lista<T> where T : IEquateable<T>
或者可以在类中插入IEqualityComparer
class Lista<T>
{
IEqualityComparer<T> _comparer;
public Lista(IEqualityComparer<T> comparer = null)
{
_comparer = comparer ?? EuqlityComparer<T>.Default;
}
public Node<T> FindNode(T vl)
{
if (this.IsEmpty()) return null;
Node<T> tmp = this.Head;
while (tmp != null && !_comparer.Equals(tmp.VL, vl) tmp = tmp.next;
return tmp;
}
}
类列表a
{
iQualityComparer\u comparer;
公共列表A(IEqualityComparer comparer=null)
{
_comparer=comparer??EuqlityComparer.Default;
}
公共节点FindNode(T vl)
{
if(this.IsEmpty())返回null;
节点tmp=这个.Head;
而(tmp!=null&&!\u comparer.Equals(tmp.VL,VL)tmp=tmp.next;
返回tmp;
}
}
泛型的发明是为了避免类似(object)的东西TMP.VL。你没有超载<代码>等值 > C如何知道你认为它们是一样的?它只能检查变量是否是相同的。instance@SeM我知道的没错,但如果我说tmp.VL==VL,它会说操作数==不能用于类型T和T@PanagiotisKanavos我该怎么做?你能解释一下吗please@JohnnyAdams在里面与其试图掩盖编译问题,不如解决它。OverrideEquals
和=
谢谢这很简单,工作起来很有魅力,但是从您建议的两种方法来看,您会推荐哪一种use@JohnnyAdams最后一个,使用IEqualityComparer通常是常见的做法。但是如果你不需要它,首先一个也不错。
while (tmp != null && !Equals(tmp.VL , vl)) tmp = tmp.next;
class Lista<T> where T : IEquateable<T>
while (tmp != null && (!tmp.VL.Equals(vl)) tmp = tmp.next;
class Lista<T>
{
IEqualityComparer<T> _comparer;
public Lista(IEqualityComparer<T> comparer = null)
{
_comparer = comparer ?? EuqlityComparer<T>.Default;
}
public Node<T> FindNode(T vl)
{
if (this.IsEmpty()) return null;
Node<T> tmp = this.Head;
while (tmp != null && !_comparer.Equals(tmp.VL, vl) tmp = tmp.next;
return tmp;
}
}