可能重复:
How do I check for nulls in an '==' operator overload without infinite recursion?
当我为对象重载==运算符时,通常会编写如下内容:
public static bool operator ==(MyObject uq1, MyObject uq2) {
if (((object)uq1 == null) || ((object)uq2 == null)) return false;
return uq1.Field1 == uq2.Field1 && uq1.Field2 == uq2.Field2;
}
如果你不下强制转换为对象,函数会自动递归,但我想知道是否没有更好的方法?
最佳答案
正如微软所说,
重载中的常见错误
运算符==使用(a==b),(a==
null),或(b==null)检查
引用相等。而是这个
导致调用重载
运算符=,导致无限循环。
使用referenceequals或强制转换类型
反对,避免循环。
所以使用referenceequals(a,null)referenceequals(b,null)是一种可能性,但是对object的强制转换同样好(我相信实际上是等价的)。
所以,是的,似乎应该有更好的方法,但你使用的方法是一个建议。
然而,正如已经指出的,当重写==时,您确实应该重写equals。由于linq提供程序是用不同的语言编写的,并且在运行时执行表达式解析,即使您自己拥有所有的代码,谁知道您什么时候会因为不这样做而感到困惑呢。