1

我有一些这样的代码:

我应该如何实现运算符 == 以便在变量是接口 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
    } 
}
4

3 回答 3

6

关键是您没有覆盖运算符 - 您正在重载它。

没有定义运算符

operator ==(IMyClass x, IMyClass y)

所以编译器没有它可以调用的东西。它不能调用

operator ==(MyClass x, MyClass y)

因为它不知道这一点m1m2实际上会引用MyClass.

据我所知,没有办法实现用于接口的运算符 - 毕竟,多个实现都可以提供自己的一个,只是为了可能的歧义。

就我个人而言,我对试图谈论非密封类型的平等开始时有些谨慎 - 平等和继承并不能很好地混合。当然,这对于接口来说是双重的:) 你最好实现一个适当的IEqualityComparer<IMyClass>并使用它。

于 2010-06-15T11:49:26.650 回答
0

查看这个问题的公认答案:== vs. Object.Equals(object) in .NET

区别在于身份平等与语义平等之一。覆盖 == 用于应该是“相同”的结构,因为它们具有相同的值,因为结构是按值复制的,因此永远不会引用同一个对象。

Equals 用于对引用类型的值相等性进行语义检查。默认情况下,这两个操作是相同的。

于 2010-06-15T12:23:11.407 回答
-3

尝试将 operator== 函数设为虚拟。

于 2010-06-15T11:49:45.840 回答