我正在创建一个简单的class
来定义一个数字(实数,虚数或复数)。为了在使用class
时让自己变得简单,我创建了自己的operator ==
版本。
public class Number
{
public double Real { get; set; }
public double Imag { get; set; }
...
public static bool operator ==(Number x, Number y)
{
return (x.Real == y.Real && x.Imag == y.Imag); // Error is thrown here
}
public static bool operator !=(Number x, Number y)
{
return !(x == y);
}
}
但是,当我想检查Number
是否为null
时,代码会抛出NullReferenceException
Number overlap = null;
Number overlapsolve = null;
...
if (overlap != null && overlapsolve != null) // This is what triggers the error
{
...
}
如何检查Number
班级是否为null
?
答案 0 :(得分:4)
首先,你知道System.Numerics.Complex
吗?这似乎正是你所需要的。
但要回答您的问题,请将您的==
运算符更改为:
public static bool operator ==(Number x, Number y)
{
if(ReferenceEquals(x, y)) return true;
if(ReferenceEquals(x, null) || ReferenceEquals(y, null)) return false;
return x.Real == y.Real && x.Imag == y.Imag;
}
注意不要使用==
进行空值检查,因为这最终会变成无限递归调用。
答案 1 :(得分:2)
它返回一个NullReferenceException,因为当你执行!=检查时,你正在检查是否
x.Real == y.Real
如果x或y为null,则抛出该异常。在检查相等性之前,您可以在重载运算符中进行简单检查以检查此情况。
答案 2 :(得分:2)
您可以使用Object.ReferenceEquals()查看它是否为空:
if (ReferenceEquals(x, null))
{
// x is null
}