.NET4.0の新しいTuple<>インスタンスの2つで.Equalsと==を使用すると、動作が異なります。タプル<>内のオブジェクトでEqualsをオーバーライドし、.Equalsをタプルで呼び出すと、Equalsのオーバーライドが呼び出されます。タプルで==を使用すると、Equalsのオーバーライドは呼び出されません。それは設計によるものであり、それは理にかなっていますか?
編集:回答とコメントから、私は明確ではないと言うことができます。タプル<>は参照型であり、参照型の場合は== ID(ReferenceEquals)をチェックします。しかし、Tuple <>は==をオーバーライドして、含まれているオブジェクトの同等性をチェックする必要がありますか?一貫性のために、おそらくそうではありません。
たとえば、単純なオブジェクトがある場合
public class NameAndNumber
{
public int Number { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj is NameAndNumber)
{
NameAndNumber other = (NameAndNumber)obj;
return Number == other.Number && Name == other.Name;
}
return false;
}
}
そして、私はこのようなことをします:
Tuple<NameAndNumber, NameAndNumber> left = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = 2 });
Tuple<NameAndNumber, NameAndNumber> right = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = 2 });
bool operatorResult = left == right;
bool equalsResult = left.Equals(right);
Console.Out.WriteLine("operatorResult = {0} equalsResult = {1}",
operatorResult, equalsResult);
私はoperatorResult=false equalsResult=trueを取得します
私はそれを期待すべきですか?
NameAndNumberでのEqualsの実装は「正しく」なく、単純化されたサンプルコードにすぎないことを私は知っています。
IEquatable、==、!=、およびGetHashCodeの実装も試しました。同じ結果。