c# - 当将整数视为对象并进行比较时,为什么整数不会提升为 double ?

标签 c# .net generics int double

我今天遇到了这个有趣的情况:

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/

相关文章:

c# - 多个 LINQ 表达式和动态属性

c# - 如何在内核找到属性时注入(inject)它

c# - 将 Owin/Katana 与 ASP.NET Core(实际用例)一起使用是否仍然相关?

C# 多个项目引用同一个 dll - 更新 dll 的简单方法是什么?

c# - 在 WPF 中隐式禁用动画

delphi - 为什么我收到 E2531 "Method requires explicit type argument"

c# - 如何检查where的结果长度

c# - P/调用教程?

.net - 如何取消单选按钮或复选框选中的更改

java - 我怎样才能使这些堆栈通用?