有人可以解释为什么result1
为false
且result2
为true
?代码如下:
namespace TestCsharp
{
class Program
{
static void Main(string[] args)
{
Order objOrder = new Order(0.0M);
bool result1 = objOrder.PriceNullable.Equals(0);//returns false
bool result2 = objOrder.PriceNullable.Value.Equals(0);// returns true
}
}
public class Order
{
public decimal? PriceNullable { get; set; }
public Order(decimal? priceNullable)
{
PriceNullable = priceNullable;
}
}
}
答案 0 :(得分:5)
因为System.Decimal
公开了可以接受Decimal
值的Equals
重载,而您的第二种情况是调用 方法(已转换int
1}}参数decimal
使用implicit conversion)并返回true。
然而在第一种情况下,Nullable
正在尽力而为,但只能调用Object.Equals
,这会在int
和decimal
之间进行比较时失败。如果你的第一个电话是:
bool result1 = objOrder.PriceNullable.Equals(0M);
您将比较两个decimal
,现在它将返回true
。
Nullable
通用Equals
方法既不能调用从int
到decimal
的隐式转换,也不能调用接受decimal
值的等于的重载。
答案 1 :(得分:2)
第一次检查返回false,因为传递给它的值不是十进制类型。如果您将M
指定为0,则会得到真实。
bool result1 = objOrder.PriceNullable.Equals(0M);
答案 2 :(得分:1)
如果我们检查Nullable<T>.Equals
的定义:
/// <summary>
/// Indicates whether the current <see cref="T:System.Nullable`1"/> object is equal
/// to a specified object.
/// </summary>
///...
// true if the <paramref name="other"/> parameter is equal to the current
// object; otherwise, false.
public override bool Equals(object other);
所以你比较了Nullable<decimal>
和int
。他们不平等。
答案 3 :(得分:1)
在第一种情况下,将int对象与decimal对象进行比较。 如果你有
bool result1 = objOrder.PriceNullable.Equals(0.0M);
result1将 true 。
答案 4 :(得分:-1)
使用时
objOrder.PriceNullable.Equals(0)
它将对象decimal?
与0 decimal
数字False
但是当你做的时候
objOrder.PriceNullable.Value.Equals(0)
它比较一个十进制值,该值为0并返回true
执行此操作以获得更多说明
decimal? nullableZero = 0;
bool result3 = objOrder.PriceNullable.Equals(nullableZero);// returns true