我今天遇到了这个有趣的情况:
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# 编译器会 secret 插入从整数到 double 的转换,并且通过使用对象中间体,编译器不会有足够的信息来执行此操作。
我的问题是,运行时没有足够的信息来将整数提升一倍以进行比较吗?如果 C# 编译器认为隐式转换是足够理想的,那么为什么 JIT 不应该有类似的行为呢?
最佳答案
C# 必须按照语言规范规定的方式工作。这与Jitter无关,它只需要实现语言规范即可。
C# 语言规范规定了 ==
必须如何工作。
CLR 规范规定了 Equals()
必须如何工作。
.Net 1.1 和 .Net 2.0 之间实际上发生了一个有趣的变化。
在 .Net 1.1 中,3f.Equals(3) == false
。
在.Net 2.0中,3f.Equals(3) == true。
这与 Equals()
的对象比较版本不同。向你展示这种事情是多么微妙。
这里有一个有趣的(但很旧的)博客:http://blogs.msdn.com/b/jmstall/archive/2005/03/23/401038.aspx
它实际上确实有一些与您的问题相关的细节,因此值得一读。
关于c# - 当将整数视为对象并进行比较时,为什么整数不会提升为 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16680293/