如果我对一个类进行operator ==
的方法重载,那么在比较字段之前必须执行一些检查:
如果两个参数都为null或者两个参数是同一个实例,则返回true。
例如:
if (System.Object.ReferenceEquals(arg1, arg2)) return true;
如果一个参数为null,但不是全部,则返回false。
例如:
if (((object)arg1 == null) || ((object)arg2 == null)) return false;
事实上,如果我有一个结构体并且想要对operator ==
进行重载,这些检查就不是必需的,因为它们是无用的。原因如下:结构体是值类型,因此它不能为null,例如DateTime date = null;
是无效的,因为DateTime
(它是一个结构体)不是引用类型,因此您不能比较两个DateTime
,其中一个设置为null
。
我创建了一个简单的结构体Point2D
,带有operator ==
,然后将Point2D
的实例与null
进行比较:
Point2D point = new Point2D(0,0);
Console.WriteLine((point == null));
显然,没有调用
operator ==
运算符,但比较结果返回False
。那么调用了哪个方法?文档指出,在不可变类型中重载此运算符是不推荐的。为什么?