我今天遇到了一个有趣的情况:
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# 编译器会秘密地插入从整数到双精度的强制转换,并且通过使用 Object 中间体,编译器没有足够的信息来执行此操作。
我的问题是,运行时是否没有足够的信息来将整数提升一倍以进行比较?如果 C# 编译器认为隐式转换足够可取,为什么 JIT 不应该有类似的行为?