样本代码:
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) true1)按预期返回true
2)与上述相同
3) false --因为我们使用Equals(object),它在内部检查:
public override bool Equals(Object obj) {
if (!(obj is Single)) {
return false;
}
...4)是真的?为什么?
public override bool Equals(Object obj) {
if (!(obj is Double)) {
return false;
}float怎么能通过这个if警卫?
发布于 2016-06-07 16:59:36
调用的函数是公共bool等于(双obj) (而不是public override bool Equals(Object obj)),它是:
public bool Equals(Double obj)
{
if (obj == m_value) {
return true;
}
return IsNaN(obj) && IsNaN(m_value);
}多亏了float到Double的隐式转换
发布于 2016-06-07 16:57:40
事实并非如此。
您在案例4中使用的重载是double.Equals(double obj)。这是因为有一个从float到double的隐式转换。
在案例3中,不存在从double到float的隐式转换,因为它可能导致精度的损失。在本例中,double将被装箱,您将使用object.Equals。
您可以通过将object.Equals转换为object来显示实际结果:
d.Equals((object)f)).Dump(); // this will be false见这把小提琴。
https://stackoverflow.com/questions/37685039
复制相似问题