示例代码:
double d = 0;
float f = 0;
// Dump() prints result in LinqPad application
(f == d).Dump(); // 1) true
(d == f).Dump(); // 2) true
(f.Equals(d)).Dump(); // 3) false
(d.Equals(f)).Dump(); // 4) true
Run Code Online (Sandbox Code Playgroud)
1)按预期返回true
2)与上面相同
3)false - 因为我们使用Equals(object),并且它在内部检查:
public override bool Equals(Object obj) {
if (!(obj is Single)) {
return false;
}
...
Run Code Online (Sandbox Code Playgroud)
4)真的吗?为什么?
public override bool Equals(Object obj) {
if (!(obj is Double)) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
如何float通过这个if警卫?
它没有.
您在案例4中使用的过载是double.Equals(double obj).这是因为,从隐式转换float到double.
在情况3,有一个从没有隐式转换double到float的,因为它可能导致精度的损失.在这种情况下,double将装箱并且您正在使用object.Equals.
您可以object.Equals通过强制转换为对象来显示实际结果:
d.Equals((object)f)).Dump(); // this will be false
Run Code Online (Sandbox Code Playgroud)
看到这个小提琴.