在==覆盖中检查null

时间:2015-05-13 19:27:06

标签: c#

在以下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完全合情合理,因为我实际上正在调用覆盖。

问题:如何编写此方法"更正"。如何理解type1type2可以null的情况?

我最好的猜测:也许我只是在这里误用了==,并且应该使用Equals覆盖来检查是否相等。但我仍然认为问题存在。那么我在推理中的错误在哪里?

3 个答案:

答案 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)