在以下C#代码段中,我覆盖了==
方法。 _type
是一些short
类型。所以我实际上说,当这两个WorkUnitType
相同时,两个short
是相同的。
public static bool operator ==(WorkUnitType type1, WorkUnitType type2)
{
if (type1 == null || type2 == null)
return false;
return type1._type == type2._type;
}
因为R#警告我,并且完全清楚为什么type1
/ type2
可能为空,我试图通过上面的if
语句来捕捉它
现在我得到的StackOverflowException
完全合情合理,因为我实际上正在调用覆盖。
问题:如何编写此方法"更正"。如何理解type1
或type2
可以null
的情况?
我最好的猜测:也许我只是在这里误用了==
,并且应该使用Equals
覆盖来检查是否相等。但我仍然认为问题存在。那么我在推理中的错误在哪里?
答案 0 :(得分:9)
您正在寻找ReferenceEquals()
函数,它将直接进行比较,绕过运算符过载。
答案 1 :(得分:2)
除了SLaks所说的,如果两者都等于null,你可能还想返回true。所以,像这样:
public static bool operator ==(WorkUnitType type1, WorkUnitType type2)
{
if (ReferenceEquals(type1, null))
return ReferenceEquals(type2, null);
if (ReferenceEquals(type2, null))
return false;
return type1._type == type2._type;
}
答案 2 :(得分:1)
为了完整性'清酒:你也可以将这两个参数转换为object
。这将使用object
中定义的实现,而不是您自定义的实现。
在代码中:
if ((object) type1 == null || (object) type2 == null)