Equalsメソッドの実装のお話です。
合同式を作ってみました。
今回の場合は、13を法とした合同式です。
以下の場合、1と14はどちらも13で割った余りが1になるので、等しいとなるはずです。
class Mod13 {
uint num;
public override bool Equals(object obj) {
var right = obj as Mod13;
if (right == null) return base.Equals(obj);
return getMod() == right.getMod();
}
public uint getMod() { return num % 13; }
public Mod13(uint num) {
this.num = num;
}
}
class Program {
static void Main(string[] args) {
var a = new Mod13(1);
var b = new Mod13(14);
Console.WriteLine("1 ≡ 14 (mod 13) :" + (a == b));
}
}
はい、この通り1と14が等しいことに…なってないですね。
Equalsをちゃんとオーバーライドしているのに…おかしいなぁ。
答え
Equals と operator== は別物です。
ということで、operator== もちゃんと追加しました。
なぜか、operator!= も作れとコンパイラに怒られたのでそちらも作っています。
これでちゃんと動くはずです。
class Mod13 {
static public bool operator ==(Mod13 left, Mod13 right) {
return left.Equals(right);
}
static public bool operator !=(Mod13 left, Mod13 right) {
return !(left == right);
}
}
ぬ、ぬるぽーーーー!?
Equalsの中でoperator== を使っているのが原因らしいです。
答え
operator== を先に作り、Equals がoperator== を利用するようにしましょう。
#ObjectがEqualsを持つ必要性がよくわかんない。IHashable のインターフェースでは駄目なの!?