仅在变量类型为派生类时才有效?

hai*_*yyu 2 c# inheritance operator-overloading

我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        Test test = new Test();
        object objTest = test;

        Console.WriteLine(test.GetType());    // Output: "OperatorOverload.Test"
        Console.WriteLine(objTest.GetType()); // Output: "OperatorOverload.Test"

        Console.WriteLine(test == null);    // Output: "True"
        Console.WriteLine(objTest == null); // Output: "False"

        test.Equals(null);    // Output: "Hi!"
        objTest.Equals(null); // Output: "Hi!"

        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

测试看起来像这样:

class Test
{

    public static bool operator ==(Test obj1, Test obj2)
    {
        return true;
    }

    public static bool operator !=(Test obj1, Test obj2)
    {
        return !(obj1 == obj2);
    }

    public override bool Equals(object obj)
    {
        Console.WriteLine("Hi!");
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

看起来运算符重载仅在你正在处理的变量的类型是定义运算符重载的类时起作用.我可以看到为什么会出现这种情况,因为我正在寻找一种检查是否安全的方法一个对象等于null.

我的问题是:

重载运算符只有在变量的类型是定义运算符的类时才起作用(我的代码告诉我是,但我可能会犯错误)?

以下代码是检查对象是否等于null的安全方法吗?

SomeClass obj = new SomeClass(); // may have overloaded operators
if ((object)obj == null)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 5

以下代码是检查对象是否等于null的安全方法吗?

if ((object)obj == null)
Run Code Online (Sandbox Code Playgroud)

是.但是,我个人更喜欢:

if (object.ReferenceEquals(obj, null))
Run Code Online (Sandbox Code Playgroud)

因为现在代码的读者清楚地知道这里发生了什么.

您可能有兴趣阅读我的文章,了解制作的设计因素Equalsoperator==奇怪的鸭子:

http://blogs.msdn.com/b/ericlippert/archive/2009/04/09/double-your-dispatch-double-your-fun.aspx