我如何检查null在'=='操作符重载没有无限递归?

以下操作将在==运算符重载方法上导致无限递归

    Foo foo1 = null;
    Foo foo2 = new Foo();
    Assert.IsFalse(foo1 == foo2);

    public static bool operator ==(Foo foo1, Foo foo2) {
        if (foo1 == null) return foo2 == null;
        return foo1.Equals(foo2);
    }

如何检查空值?

请先 登录 后评论

6 个回答

Andrew Jones

在重载方法中强制转换为对象:

public static bool operator ==(Foo foo1, Foo foo2) {
    if ((object) foo1 == null) return (object) foo2 == null;
    return foo1.Equals(foo2);
}
请先 登录 后评论
Abe Heidebrecht

使用 ReferenceEquals

Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);

public static bool operator ==(Foo foo1, Foo foo2) {
    if (object.ReferenceEquals(null, foo1))
        return object.ReferenceEquals(null, foo2);
    return foo1.Equals(foo2);
}
请先 登录 后评论
Santiago Palladino

试一试 Object.ReferenceEquals(foo1, null)

不管怎样,我不建议重载 ==运营商;它应该被用来比较参考资料,并使用 3. “语义”的比较。

请先 登录 后评论
Jon Adams

使用 ReferenceEquals。来自MSDN论坛:

public static bool operator ==(Foo foo1, Foo foo2) {
    if (ReferenceEquals(foo1, null)) return ReferenceEquals(foo2, null);
    if (ReferenceEquals(foo2, null)) return false;
    return foo1.field1 == foo2.field2;
}
请先 登录 后评论
The Digital Gabeg

您可以尝试使用对象属性并捕获结果NullReferenceException。如果您尝试的属性是从Object继承或重写的,那么这对任何类都适用。

public static bool operator ==(Foo foo1, Foo foo2)
{
    //  check if the left parameter is null
    bool LeftNull = false;
    try { Type temp = a_left.GetType(); }
    catch { LeftNull = true; }

    //  check if the right parameter is null
    bool RightNull = false;
    try { Type temp = a_right.GetType(); }
    catch { RightNull = true; }

    //  null checking results
    if (LeftNull && RightNull) return true;
    else if (LeftNull || RightNull) return false;
    else return foo1.field1 == foo2.field2;
}
请先 登录 后评论
Hallgrim

如果我已经覆盖了 bool Equals(object obj) 我要找接线员 == 而且 3. 返回相同的答案,我通常实现 != 运营商是这样的:

public static bool operator ==(Foo foo1, Foo foo2) {
  return object.Equals(foo1, foo2);
}
public static bool operator !=(Foo foo1, Foo foo2) {
  return !object.Equals(foo1, foo2);
}

操作员 == 那么在为我做了所有的空检查之后,会结束调用吗 foo1.Equals(foo2) 我已经重写了它来检查两者是否相等。

请先 登录 后评论
  • 20 关注
  • 0 收藏,284 浏览
  • Andrew Jones 提出于 2022-11-02 18:53