我认为在两个空列表上调用Equals()会返回true,但事实并非如此。有人能解释一下原因吗?
var lst = new List<Whatever>();
var lst2 = new List<Whatever>();
if(!lst.Equals(lst2))
throw new Exception("seriously?"); // always thrown
答案 0 :(得分:7)
由于Equals
正在检查引用,因此lst
和lst2
是不同的对象。 (请注意,等于继承自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中,您有引用类型和值类型。
值类型代表值。 integer
,double
,DateTime
等等。
比较值类型时,比较它们的实际值,所以:
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