在重载 "==" 运算符时检查 null。

8
在下面的C#代码片段中,我重写了==方法。_type是一个short类型的数字。因此,我实际上是在说当这两个short相同时,两个WorkUnitType是相同的。
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个回答

9
你正在寻找ReferenceEquals()函数,它可以直接进行比较,跳过你的运算符重载。

我不知道ReferenceEquals存在。这实际上就是答案。谢谢。 - Stephan

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

1

为了完整起见:您还可以将这两个参数转换为 object。这将使用 object 中定义的实现而不是您自定义的实现。

代码如下:

if ((object) type1 == null || (object) type2 == null)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接