(a == 1 && a == 2 && a == 3) を常に真にできますか? が話題になっていたような気がしたのでC#で解いてみます。
getterで++使えば一瞬やで!
…と思ったら先人がいたので別解を目指します。
演算子のオーバーロード
C#も演算子のオーバーロードを使うことができるのでこちらを用います。
とりあえず次のようなクラスを作成します。
MagicNumber
public class MagicNumber
{
public MagicNumber(int n)
{
Value = n;
}
public int Value { get; set; }
}
このMagicNumberに常にtrueとなる==
演算子を実装すれば何とかなるわけです。
演算子はpublic static int operator +(MagicNumber a, int b)
のような形で実装できます。
!=
演算子も一緒に実装してやる必要があります。
MagicNumber
public class MagicNumber
{
public MagicNumber(int n)
{
Value = n;
}
public int Value { get; set; }
public static bool operator ==(MagicNumber a, int b) { return true; }
public static bool operator !=(MagicNumber x, int y) { return true; }
}
これで==
でも!=
でも常にtrueを返す演算子が作れました。
…といいたいところですが、このままでは警告が出ます。
==
演算子と!=
演算子を実装するにはEquals()
とGetHashCode()
も実装することが推奨されるようです。
そんなわけで最終的にはこうなりました。
MagicNumber
public class MagicNumber
{
public MagicNumber(int n)
{
Value = n;
}
public int Value { get; set; }
public static bool operator ==(MagicNumber a, int b) { return true; }
public static bool operator !=(MagicNumber x, int y) { return true; }
public override bool Equals(System.Object obj) { return true; }
public override int GetHashCode() { return Value ^ Value; }
}
参考
演算子のオーバーロード (++C++; // 未確認飛行 C)
Equals() と演算子 == のオーバーロードに関するガイドライン (C# プログラミング ガイド)