7

有人可以解释为什么result1isfalseresult2istrue吗?代码如下:

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;

        }
    }
}   
4

5 回答 5

5

因为System.Decimal暴露了Equals可以接受Decimal值的重载,而您的第二种情况是调用方法(已使用隐式转换int将参数转换为 a )并返回 true。decimal

而在第一种情况下, theNullable正在尽力而为,但只能调用which 将在 an和 aObject.Equals之间进行比较时失败。如果您的第一个电话是:intdecimal

bool result1 = objOrder.PriceNullable.Equals(0M);

您将比较两个decimals,它现在将返回true


Nullable泛型Equals方法既不能调用 to 的隐式转换int,也不能调用decimal接受decimal值的 equals 的重载。

于 2012-10-01T09:28:09.637 回答
2

第一个检查返回 false,因为传递给它的值不是十进制类型。如果你M用 0 指定,你会得到真实的。

bool result1 = objOrder.PriceNullable.Equals(0M);
于 2012-10-01T09:26:49.887 回答
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. 他们不相等。

于 2012-10-01T09:28:03.927 回答
1

Nullable.Equals

在第一种情况下,您将 int 对象与 decimal 对象进行比较。如果你有

bool result1 = objOrder.PriceNullable.Equals(0.0M);

result1 将是true

于 2012-10-01T09:30:10.480 回答
-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
于 2012-10-01T09:27:51.293 回答