让我们从一段非常简单的代码开始:
decimal d = 2;
Console.WriteLine("d == 2 = {0}", d == 2);
Console.WriteLine("d == (decimal)2 = {0}", d == (decimal)2);
Console.WriteLine("d.Equals(2) = {0}", d.Equals(2));
Console.WriteLine("d.Equals((decimal)2) = {0}", d.Equals((decimal)2));
结果是 4xtrue。现在,让我们将变量d的类型更改为十进制?:
decimal? d = 2;
这次结果将是True, True, False, True。这种情况的解释很容易。对于Nullable<T>类型, Equals方法实现如下:
public override bool Equals(object other)
{
if (!this.HasValue)
{
return (other == null);
}
if (other == null)
{
return false;
}
return this.value.Equals(other);
}
如果this有一个值并且其他参数不为 null,则将调用Decimal.Equals(object value)。Decimal.Equals(object value)方法以这种方式工作,如果value参数不是小数,则结果将始终为false。
在我看来,当前的实现并不直观,我想知道为什么Nullable<T>不为开发人员提供Equals方法的通用版本,例如:
public bool Equals(T other)
{
if (!this.HasValue)
return false;
return this.value.Equals(other);
}
是故意的还是疏忽了?
评论1:
简短的评论要清楚。我建议Nullable<T>应该有两个Equals方法,即:public override bool Equals(object other)和public bool Equals(T other)