我接受采访时被要求回答一个问题:
C#支持运算符覆盖吗?
我知道支持运算符重载但我不知道覆盖运算符。有可能吗?
答案 0 :(得分:13)
不,不支持运营商覆盖。当子类继承一个方法并且子类用它自己的实现覆盖它时,使用术语Overriding。操作符在C#中都是静态的,不能被覆盖。
重载意味着定义了另一个具有相同名称但具有不同签名(参数)的方法。这就是你可以对运营商做的事情。
在C#中编写运算符时,这一点非常重要。运算符在编译时受到约束。在运行时传递给操作员的有效类型根本不重要。
EG。你写了一些比较运算符
public static bool operator==(MyClass c1, MyClass c2)
{
//...
}
并拥有以下代码:
object myObj1 = new MyClass();
object myObj2 = new MyClass();
if (myObj1 == myObj2)
//...
对象的运算符将被调用,而不是你自己的,因为 参数是对象类型的引用。
答案 1 :(得分:2)
关于这个问题,这是一个非常好的article。它解释了重载和重写之间的区别,然后继续将这些定义放在C#运算符上。