2012-02-16 34 views
2

我有以下代码:只有当变量类型是派生类时才起作用?

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(); 
    } 
} 

测试看起来是这样的:

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; 
    } 

} 

看来,运营商只有重载作品时,你处理的变量的类型是类运营商重载定义在。我可以看到为什么会是这样,因为我正在寻找一种安全的方式来检查对象是否等于null。

我的问题是:

不要重载运算仅当该变量的类型是运营商在定义的类工作(我的代码告诉我,是的,但我可能是犯了一个错误)?

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

SomeClass obj = new SomeClass(); // may have overloaded operators 
if ((object)obj == null) 
{ 
    // ... 
} 
+0

退房的答案,我认为这是相关的:HTTP://计算器。 com/a/2186908/453056 – Kyle 2012-02-16 05:51:26

回答

2

在C# 首要 重载操作员实质上创建与其名称类似op_xxx(例如op_Add,op_Equality)的静态方法。在你的问题中,test == null行为如Test.op_Equality(test, null)显然返回true。而objTest == null调用Object.op_Equality(test, null)返回false。另一方面,您覆盖虚拟方法Equals,因此test.EqualsobjTest.Equals具有相同的结果。

+0

谢谢,现在我认为运算符是静态方法,这对我来说更有意义。 – haiyyu 2012-02-16 06:01:06

+0

@haiyyu:这就是为什么我们要求您将运算符*声明为静态方法*。 – 2012-02-16 15:49:50

+0

实际上,object.op_Equality()方法不存在。但是,行为类似于它。 – svick 2012-02-16 17:22:30

相关问题