Ric*_*ckL 1 c# syntax operator-overloading equals-operator
我有一些像这样的代码:
我应该如何实现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
}
}
Run Code Online (Sandbox Code Playgroud)
关键是你没有覆盖一个运营商 - 你正在超载它.
没有为运营商定义
operator ==(IMyClass x, IMyClass y)
Run Code Online (Sandbox Code Playgroud)
所以编译器没有什么可以调用的.它不能打电话
operator ==(MyClass x, MyClass y)
Run Code Online (Sandbox Code Playgroud)
因为它不知道m1并且m2实际上会引用实例MyClass.
据我所知,没有办法实现一个用于接口的运算符 - 毕竟,多个实现都可以提供自己的一个,只是为了一点可能的歧义.
就个人而言,我有点担心试图谈论非密封类型的平等开始 - 平等和继承不会非常好地混合.对于接口而言,这当然是双倍的:)你可能最好实现一个合适的IEqualityComparer<IMyClass>并使用它.