今日、私はこの興味深い状況に出くわしました:
var a = new HashSet<Object> { 1.0, 2.0, 3.0 };
a.Contains(1); //False
a.Contains(1.0); //True
もちろん、これはこれの一般的なバージョンにすぎません。
Object b = 2.0;
b.Equals(2); //False
b.Equals(2.0); //True
この理由は、私が書く2.0 == 2
と、C# コンパイラが整数から倍精度へのキャストを秘密裏に挿入し、オブジェクト中間体を使用することで、コンパイラがこれを行うのに十分な情報を持っていないためであることに気付きました。
私の質問は、比較のために整数を2倍にするのに十分な情報がランタイムにないのでしょうか? C# コンパイラが、暗黙的な変換が必要であると判断した場合、JIT が同様の動作を行うべきではないのはなぜでしょうか?