Это следующий вопрос: Список <T> .Contains и T []. Содержит поведение по-разному
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.
Почему массив, вызывающий Equals
по-разному для struct[]
и class[]
, , хотя обе коллекции, похоже, выглядят родовыми?
Странность массива настолько расстраивает, что я думаю об этом полностью избегать...
Примечание. Общая версия Equals
вызывается только тогда, когда struct реализует IEquatable<T>
. Если тип не реализует IEquatable<T>
, то негенерическая перегрузка Equals
вызывается независимо от того, является ли она class
или struct
.