我有一些像这样的代码:
我应该如何实现operator ==,以便在变量是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
}
}
答案 0 :(得分:6)
关键是你不是覆盖一个运营商 - 你重载它。
没有为
定义运算符operator ==(IMyClass x, IMyClass y)
所以编译器没有任何可以调用的东西。它无法调用
operator ==(MyClass x, MyClass y)
因为它不知道m1
和m2
实际上会引用MyClass
的实例。
据我所知,没有办法实现一个用于接口的运算符 - 毕竟,多个实现都可以提供自己的实现,只是为了一点可能的歧义。
就我个人而言,我有点担心尝试谈论非密封类型的平等 - 平等和继承不能很好地混合。对于接口而言,这当然是双倍的:)你可能最好实现适当的IEqualityComparer<IMyClass>
并使用它。
答案 1 :(得分:0)
查看此问题的已接受答案:== vs. Object.Equals(object) in .NET
区别在于身份平等与语义平等。覆盖==意味着结构应该是'相同',因为它们具有相同的值,因为结构是按值复制的,因此永远不会引用同一个对象。
Equals用于对Reference类型的值相等性进行语义检查。默认情况下,这两个操作是相同的。
答案 2 :(得分:-3)
尝试使operator == function virtual。