Это следующий вопрос: Список <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.
