LoginSignup
1
0

More than 5 years have passed since last update.

(a == 1 && a == 2 && a == 3) を演算子オーバーロードで常に真にする C#編

Posted at

(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)のような形で実装できます。

しかし==演算子は単独では実装できません。
image.png

!=演算子も一緒に実装してやる必要があります。

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を返す演算子が作れました。

…といいたいところですが、このままでは警告が出ます。
image.png
==演算子と!=演算子を実装するには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; }
}

image.png
やったね。

参考

演算子のオーバーロード (++C++; // 未確認飛行 C)
Equals() と演算子 == のオーバーロードに関するガイドライン (C# プログラミング ガイド)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0