C# 当使用接口而不是实际类型时,如何重写运算符==?
我有一些这样的代码: 我应该如何实现运算符==以便在变量为接口IMyClass时调用它C# 当使用接口而不是实际类型时,如何重写运算符==?,c#,syntax,operator-overloading,equals-operator,C#,Syntax,Operator Overloading,Equals 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 == nu
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
}
}
关键是您没有重写运算符-您正在重载它 没有为定义运算符
operator ==(IMyClass x, IMyClass y)
因此编译器无法调用任何东西。它不能打电话
operator ==(MyClass x, MyClass y)
因为它不知道m1
和m2
实际上会引用MyClass
的实例
据我所知,没有办法实现一个用于接口的操作符——毕竟,多个实现都可以提供自己的操作符,只是为了一个可能的模糊点
就我个人而言,我有点担心一开始就试图谈论非密封类型的平等性——平等性和继承性并没有很好地结合在一起。当然,对于接口来说,这是双重的:)您最好实现一个合适的
IEqualityComparer
,并使用它。尝试将操作符==函数设置为虚拟的。查看这个问题的公认答案:
区别在于身份平等与语义平等。重写==指的是假定为“相同”的结构,因为它们具有相同的值,因为结构是按值复制的,因此从不引用同一对象
Equals用于对引用类型的值相等进行语义检查。默认情况下,这两个操作是相同的。它是静态的,因此不能是虚拟的。运算符没有被重写,它们是重载的。我不同意。排除NaN和重载问题,
Equals
和==
对于引用类型应该是等效的。