Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当使用接口而不是实际类型时,如何重写运算符==?_C#_Syntax_Operator Overloading_Equals Operator - Fatal编程技术网

C# 当使用接口而不是实际类型时,如何重写运算符==?

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

我有一些这样的代码:

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

关键是您没有重写运算符-您正在重载它

没有为定义运算符

operator ==(IMyClass x, IMyClass y)
因此编译器无法调用任何东西。它不能打电话

operator ==(MyClass x, MyClass y)
因为它不知道
m1
m2
实际上会引用
MyClass
的实例

据我所知,没有办法实现一个用于接口的操作符——毕竟,多个实现都可以提供自己的操作符,只是为了一个可能的模糊点


就我个人而言,我有点担心一开始就试图谈论非密封类型的平等性——平等性和继承性并没有很好地结合在一起。当然,对于接口来说,这是双重的:)您最好实现一个合适的
IEqualityComparer
,并使用它。

尝试将操作符==函数设置为虚拟的。

查看这个问题的公认答案:

区别在于身份平等与语义平等。重写==指的是假定为“相同”的结构,因为它们具有相同的值,因为结构是按值复制的,因此从不引用同一对象


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

它是静态的,因此不能是虚拟的。运算符没有被重写,它们是重载的。我不同意。排除NaN和重载问题,
Equals
==
对于引用类型应该是等效的。