非常に単純なコードから始めましょう。
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の型を10 進数に変更してみましょう。:
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);
}
これに値があり、他のパラメーターが null でない場合、Decimal.Equals (オブジェクト値)が呼び出されます。Decimal.Equals(object value)メソッドはこのように機能し、値パラメーターが10 進数でない場合、結果は常にfalseになります。
現在の実装は直感的ではないように思えます.Nullable<T>が開発者にEqualsメソッドの汎用バージョンを提供しないのはなぜだろうか.例えば:
public bool Equals(T other)
{
if (!this.HasValue)
return false;
return this.value.Equals(other);
}
わざとやったのか、それとも手抜きなのか。
コメント 1:
明確にするための簡単なコメント。Nullable<T>には 2 つのEqualsメソッド、つまりpublic override bool Equals(object other)とpublic bool Equals(T other)が必要であることを提案しました。