【问题标题】:overloading operator== and comparison to null重载 operator== 并与 null 比较
【发布时间】:2011-02-19 20:35:31
【问题描述】:

我有一个重载operator== 的类来比较两个对象,但是当我对照null 检查该类型的对象时,我在第一个参数上得到一个空引用异常。我想知道我应该如何防范这种情况,或者有其他方法可以实现这个operator==

Card c;

if (c == null) { // do something }  //null check throws exception cause c1 in operator has is a null object...

 public static bool operator ==(Card c1, Card c2)
        {
            if (ReferenceEquals(c1, null) )
                return false; // this does not make sense either I guess??
            return c1.Equals(c2);
        }

【问题讨论】:

    标签: c# operator-overloading


    【解决方案1】:

    ReferenceEquals 检查应该这样做;实际上,厚颜无耻的路线可以是:

    if(((object)c1) == ((object)c2)) return true;
    if(((object)c1) == null || ((object)c2) == null) return false;
    return c1.Equals(c2);
    

    (object) 强制转换本质上是 NOP,只是强制它执行引用检查而不是递归地访问 ==,但也不需要对 ReferenceEquals 进行额外的静态调用。

    【讨论】:

    • 我一直认为 ReferenceEquals 是内联的(最后它所做的只是接收“作为对象”的对象并将它们与 == 进行比较)。
    • @Marc Gravell,但你在 4 个月前说过,你会使用 ReferenceEquals :) stackoverflow.com/a/4105699/152291
    • 这个答案救了我的命。但是请记住,当重载“==”时,也必须重载“!=”。对于此重载,必须按照 (((object)c1) != ((object)c2)) return true; 来实现 Marc 答案。 if (((object)c1) == null || ((object)c2) == null) return true;
    【解决方案2】:

    See these guidelines 从该页面:

    重载的运算符 == 实现不应抛出异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-27
      • 2023-02-02
      • 2010-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      相关资源
      最近更新 更多