C# 我是否已更改被重写的“==”运算符的意图?

C# 我是否已更改被重写的“==”运算符的意图?,c#,null,operator-overloading,C#,Null,Operator Overloading,以下重载的==运算符是中的日历类的一部分 当我尝试访问SouthAfricanCalendar属性时,我收到一个System.NullReferenceException:对象引用未设置为对象的实例。这促使我深入研究源代码 public SouthAfrica SouthAfricanCalender { get { if (_calender == null) { _calender = new SouthAfrica();

以下重载的
==
运算符是中的
日历类的一部分

当我尝试访问
SouthAfricanCalendar
属性时,我收到一个
System.NullReferenceException:对象引用未设置为对象的实例。
这促使我深入研究源代码

public SouthAfrica SouthAfricanCalender
{
    get
    {
        if (_calender == null)
        {
        _calender = new SouthAfrica();
        }
    return _calender;
    }
    set
    {
        if (_calender == null)
        { 
        _calender = value;
        }
    }
}

SouthAfrica _calender;
根据答案,我已对过载进行了如下处理

我的问题是,我的修正案是否改变了原法典的意图

编辑:有没有关于如何进一步清理的建议?

没有


它仍然会检查是否相等。

否。您可以确保这两个对象都是对象,并相应地在它们不是的位置做出响应(假设ReferenceEquals可以处理双空)。然后,您只需执行相同的检查。整个.empty()是完全不必要的,顺便说一下,您已经知道它不是null,只需返回名称比较。

如果((对象)c1==null | |(对象)c2==null)返回false,您不需要
不需要对对象进行强制转换。仅当c1==null | |(c2==null)返回false时
@aliostad-谢谢你的建议…@aliostad:不是真的!如果不强制转换到
对象
,您可能会得到无限循环的
=
调用,导致
StackOverflowException
。在更新的==方法中,在前两个if语句之后,您已经确定c1和c2都是非空的。您可以将return语句更改为
return c1.name()==c2.name()
@david-我也这么想-只需要确保
name()
函数中没有奇怪的事情发生。
public SouthAfrica SouthAfricanCalender
{
    get
    {
        if (_calender == null)
        {
        _calender = new SouthAfrica();
        }
    return _calender;
    }
    set
    {
        if (_calender == null)
        { 
        _calender = value;
        }
    }
}

SouthAfrica _calender;
public static bool operator ==(Calendar c1, Calendar c2)
{
   if ( object.ReferenceEquals(c1,c2)) return true;
   if ((object)c1 == null || (object)c2 == null) return false;

   return (c1.empty() && c2.empty())
       || (!c1.empty() && !c2.empty() && c1.name() == c2.name());
}