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在里面与其试图掩盖编译问题,不如解决它。Override
Equals
=
谢谢这很简单,工作起来很有魅力,但是从您建议的两种方法来看,您会推荐哪一种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;
       }
  }