На самом деле, это не так.Оператор ==
по умолчанию будет проверять на равенство ссылок, независимо от переопределенного поведения вашего метода Equals
(если вы его переопределили, что вам, безусловно, следует иметь, если вы реализовали IEquatable<T>
).
То есть, если ваши переменные набраны как object
, но вы хотите использовать собственное сравнение на равенство, используйте Equals(x, y)
вместо x == y
.
Тогда, даже если вы реализовалиIEquatable<T>
, обязательно по-прежнему переопределяйте object.Equals
, например:
class MyType : IEquatable<MyType>
{
public bool Equals(MyType other)
{
// Whatever you want.
}
public override bool Equals(object other)
{
// Presumably you check for null above.
return Equals(other as MyType);
}
}
Хотя вы, конечно, можете также перегружать ==
и !=
операторы для вашего типа, это ничего не даст, если у вас есть ссылки на объекты этого типа, которые являются просто object
переменными, например:
object x = new MyType();
object y = new MyType();
Console.WriteLine(Equals(x, y));
Console.WriteLine(x == y);
Выше не будет работать, как вы могли быожидайте (если вы перегружены ==
и ожидаете, что это будет использоваться), потому что перегрузка ==
должна быть разрешена во время компиляции;поскольку x
и y
вводятся как произвольные объекты, компилятор C # выберет оператор ==
типа object
, который, опять же, просто проверяет равенство ссылок.
Обновление : Теперь вы можете убедиться, что ваш оператор ==
используется, если ваши переменные введены в виде класса, в котором вы определили его или более производного типа.Например, для следующих типов:
class A
{
public static bool operator ==(A x, A y) { return true; }
public static bool operator !=(A x, A b) { return false; }
}
class B : A { }
class AComparer<T> where T : A
{
public bool CompareEqual(T x, T y) { return x == y; }
}
Приведенный выше метод AComparer<T>.CompareEqual
будет использовать ваш перегруженный оператор ==
для любого типа T
, производного от A
.
Главное, что нужно помнить, это то, что ==
равен static , что означает, что его разрешение перегрузки выполняется во время компиляции, а не во время выполнения с использованием vtable (если вы не используетеdynamic
, но это совсем другой зверь).Так что просто помните об этом всякий раз, когда вы используете в коде оператор ==
, и вы хотите, чтобы перегрузка перешла к перестановке вашего пользовательского типа.