GetHashCode()
クラスがハッシュテーブルまたはディクショナリで機能するには、 !を実装する必要があります。なぜHashSetで機能するのかわかりません。運が良かったと思います。
EqualsまたはGetHashCode()の計算に可変フィールドを使用するのは危険であることに注意してください。なんで?このことを考慮:
var x = new Int16_2D { a = 1, b = 2 };
var set = new HashSet<Int16_2D> { x };
var y = new Int16_2D { a = 1, b = 2 };
Console.WriteLine(set.Contains(y)); // True
x.a = 3;
Console.WriteLine(set.Contains(y)); // False
Console.WriteLine(set.Contains(x)); // Also false!
つまり、設定x.a = 3;
すると、xのハッシュコードが変更されます。ただし、ハッシュテーブル内のxの位置は古いハッシュコードに基づいているため、xは基本的に失われます。http://ideone.com/QQw08でこれを実際に見てください
また、svickが指摘しているように、実装は実装Equals
しません==
。を実装しない場合==
、==
演算子は参照比較を提供するため、次のようになります。
var x = new Int16_2d { a = 1, b = 2 };
var y = new Int16_2d { a = 1, b = 2 };
Console.WriteLine(x.Equals(y)); //True
Console.WriteLine(x == y); //False
結論として、これを不変のタイプにする方がよいでしょう。たった4バイトの長さなので、おそらく不変の構造体にします。