Как вы переопределяете оператор == при использовании интерфейсов вместо реальных типов?
У меня есть такой код:
Как мне реализовать оператор ==, чтобы он вызывался, когда переменные имеют интерфейс IMyClass?
public class MyClass : IMyClass
{
public static bool operator ==(MyClass a, MyClass b)
{
if (ReferenceEquals(a, b))
return true;
if ((Object)a == null || (Object)b == null)
return false;
return false;
}
public static bool operator !=(MyClass a, MyClass b)
{
return !(a == b);
}
}
class Program
{
static void Main(string[] args)
{
IMyClass m1 = new MyClass();
IMyClass m2 = new MyClass();
MyClass m3 = new MyClass();
MyClass m4 = new MyClass();
Console.WriteLine(m1 == m2); // does not go into custom == function. why not?
Console.WriteLine(m3 == m4); // DOES go into custom == function
}
}
3 ответа
Ключ в том, что вы не переопределяете оператора - вы перегружаете его.
Там нет оператора, определенного для
operator ==(IMyClass x, IMyClass y)
поэтому компилятор не имеет ничего, что он мог бы вызвать. Это не может позвонить
operator ==(MyClass x, MyClass y)
как это не знает, что m1
а также m2
на самом деле будет ссылаться на экземпляр MyClass
,
Насколько я знаю, нет способа реализовать оператор, который будет использоваться для интерфейсов - в конце концов, несколько реализаций могут предоставить свой собственный, только для одной точки возможной неопределенности.
Лично я с некоторой осторожностью пытаюсь говорить о равенстве по сравнению с незапечатанными типами - равенство и наследование не очень хорошо сочетаются. Конечно, это вдвойне относится к интерфейсам:). Возможно, вам лучше реализовать соответствующий IEqualityComparer<IMyClass>
и используя это вместо этого.
Посмотрите в принятом ответе на этот вопрос: == против Object.Equals(объект) в.NET
Разница между идентичностью и семантическим равенством. Переопределение == предназначено для структур, которые должны быть "одинаковыми", потому что они имеют одинаковые значения, поскольку структуры копируются по значению и поэтому никогда не являются ссылками на один и тот же объект.
Равные используются для семантической проверки равенства значений для ссылочных типов. По умолчанию обе операции одинаковы.