为什么两个空列表不相等?

时间:2012-01-11 12:08:18

标签: c#

我认为在两个空列表上调用Equals()会返回true,但事实并非如此。有人能解释一下原因吗?

var lst = new List<Whatever>();
var lst2 = new List<Whatever>();
if(!lst.Equals(lst2))
    throw new Exception("seriously?"); // always thrown

11 个答案:

答案 0 :(得分:7)

由于Equals正在检查引用,因此lstlst2是不同的对象。 (请注意,等于继承自Object,未在List<T>中实施)

你正在寻找Linq的SequenceEquals 即使使用SequenceEquals,也不要指望它在非空列表上使用Whatever类(除非它是结构)。您可能希望实施comparer,并使用right overload

答案 1 :(得分:3)

Equals这里比较两个列表的引用,这两个列表是不同的,因为它们是单独的列表,这就是为什么在这种情况下它总是假的。

答案 2 :(得分:3)

对象文档(MSDN文档):

  

Equals的默认实现支持引用类型的引用相等性和值类型的按位相等性。引用相等意味着被比较的对象引用引用相同的对象。按位相等意味着被比较的对象具有相同的二进制表示。

列出文档(MSDN文档):

  

确定指定的Object是否等于当前的Object。 (继承自Object。)

你有两个不同的对象(新的两次......)所以不一样。

答案 3 :(得分:2)

因为它比较了对象标识,而不是列表的内容。它们是两个独立的对象。

请参阅C#常见问题解答中的answer

答案 4 :(得分:2)

Equals的{​​{1}}实施是来自List<T>的继承实施:

  

Equals的默认实现支持引用类型的引用相等性

换句话说,由于它们是两个不同的列表,因此它们具有不同的引用,因此Object会返回Equals

答案 5 :(得分:1)

List<T>.Equals()将比较两个列表的引用,如果它们相等则返回true。如果要比较两个列表的元素,请使用List<T>.SequenceEquals()

答案 6 :(得分:1)

当您将2个列表相互比较时,equals方法将不会比较该列表中的项目。它只是将List对象与另一个List对象进行比较。这些都有自己的“身份”。

答案 7 :(得分:0)

据我所知,文档中的.Equals是来自Object的继承方法,这意味着它检查列表是否是同一个对象。既然你已经制作了两个对象,那么它们就不一样了。

答案 8 :(得分:0)

它们是在内存中分配的两个不同的列表(使用new关键字)。因此他们不能平等。如果你想要这样的功能,你应该构建自己的继承自List和重写Equals函数的对象

答案 9 :(得分:0)

在C#和.Net中,您有引用类型和值类型。

值类型代表值。 integerdoubleDateTime等等。

比较值类型时,比较它们的实际值,所以:

int a = 10;
int b = 10;

if( a == b ) 
{
    // this will fire
}

请注意,每个变量都引用一个新副本,因此:

int c = a;
c = c+5;

if( a == c ) 
{
    // this won't, because a==10 and c==15
}

引用类型是您传递的对象。您可以有多个变量引用同一个对象,所以:

var a = new List<Whatever>();
var b = new List<Whatever>();
if( a == b ) 
{
    // this won't fire, a and be are separate objects
}

var c = a;
c.Add(new Whatever());
if( a == c ) 
{
    // this will, a and c are the same object.
    a[0]; // holds the value added to c
}

最后,一些引用类型的特殊情况与值类型相似,例如string

答案 10 :(得分:-1)

两个不同的东西是不能相同的,即使这些东西都有相同的项目(或者都是空的)。

你不需要擅长编程才能理解这一点;)让我们说你有一个这个那个,它的重要性不是什么这个 。重要的是, 不是 。多数民众赞成你用equals

检查那里