C#で(a ==1 && a== 2 && a==3)」の結果を真にする方法

先ほどはてブで、JavaScriptで「(a ==1 && a== 2 && a==3)」の結果を真にする手法が議論されるという記事を見かけたのでC#で同様の結果を得るためにはどうすればいいのか考えてみまました。

この問題、左辺の「a」の型が明示されていないことを利用してC#でも解けそうです。

実現案(1) ==演算子をオーバーロードする

タイトルの通り演算子のオーバーロードを以下の通り持つクラスを定義します。

自分の型とintを比較したときに1~3であれば比較結果が真になります。

public class Equal123
{
    public static bool operator ==(Equal123 a, int b)
    {
        if (b == 1 || b == 2 || b == 3)
        {
            return true;
        }

        return false;
    }

    public static bool operator !=(Equal123 a, int b)
    {
        return false;
    }
}

Main関数で検証用コードを呼び出すと以下の通り真となります。

public static void Main(string[] args)
{
    var a = new Equal123();

    if (a == 1 && a == 2 && a == 3)
    {
        Console.WriteLine("true");
    }
    else
    {
        Console.WriteLine("false");
    }
    
    // true と出力される
}

実現案(2) そういう応答をするプロパティを作成する

aをプロパティとして、問い合わせのたびに応答値が変化する実装を行います。

// 呼び出すたびに応答が1 → 2 → 3と繰り返し変化するプロパティ
private static int i = 1;
public static int a
{
    get
    {
        if (i > 3)
        {
            i = 1;
        }

        return i++;
    }
}

// 呼び出して確認
public static void Main(string[] args)
{
    if (a == 1 && a == 2 && a == 3)
    {
        Console.WriteLine("true");
    }
    else
    {
        Console.WriteLine("false");
    }
    
    // true と出力される
}

お粗末さまでした。