这是对此的后续问题: List<T>.Contains 和 T[].Contains 表现不同
T[].Contains
T
当是类和结构时表现不同。假设我有这个结构:
public struct Animal : IEquatable<Animal>
{
public string Name { get; set; }
public bool Equals(Animal other) //<- he is the man
{
return Name == other.Name;
}
public override bool Equals(object obj)
{
return Equals((Animal)obj);
}
public override int GetHashCode()
{
return Name == null ? 0 : Name.GetHashCode();
}
}
var animals = new[] { new Animal { Name = "Fred" } };
animals.Contains(new Animal { Name = "Fred" }); // calls Equals(Animal)
在这里,如我所料,通用Equals
被正确地称为。
但如果是一类:
public class Animal : IEquatable<Animal>
{
public string Name { get; set; }
public bool Equals(Animal other)
{
return Name == other.Name;
}
public override bool Equals(object obj) //<- he is the man
{
return Equals((Animal)obj);
}
public override int GetHashCode()
{
return Name == null ? 0 : Name.GetHashCode();
}
}
var animals = new[] { new Animal { Name = "Fred" } };
animals.Contains(new Animal { Name = "Fred" }); // calls Equals(object)
调用非泛型Equals
,带走了实现 IEquatable 的好处。
为什么数组对and的调用Equals
不同,即使这两个集合看起来都很通用?struct[]
class[]
数组的怪异是如此令人沮丧,以至于我正在考虑完全避免它...
注意:的通用版本Equals
仅在结构实现时调用IEquatable<T>
。如果类型没有实现IEquatable<T>
,则调用非泛型重载,Equals
无论它是class
还是struct
。