7

誰かがなぜresult1isfalseresult2isを説明できますか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;

        }
    }
}   
4

5 に答える 5

5

値を受け入れることができるSystem.Decimalのオーバーロードを公開しているため、2 番目のケースはそのメソッドを呼び出し(暗黙的な変換を使用してパラメーターを に変換した)、true を返すためです。EqualsDecimalintdecimal

最初のケースでは、は最善を尽くしていますが、と を比較するときに失敗するNullable呼び出ししかできません。最初の電話が次の場合:Object.Equalsintdecimal

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

2 つの を比較するdecimalと、 が返されtrueます。


Nullableジェネリックメソッドは、からへEqualsの暗黙的な変換も、値を受け入れる equals のオーバーロードも呼び出すことができません。intdecimaldecimal

于 2012-10-01T09:28:09.637 に答える
2

最初のチェックは、渡された値が decimal 型ではないため、false を返しています。M0 を指定すると true になります。

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 の 10 進数値を比較して返しますtrue

より明確にするためにこれを行います

decimal? nullableZero = 0;
bool result3 = objOrder.PriceNullable.Equals(nullableZero);// returns true
于 2012-10-01T09:27:51.293 に答える