_double.Equals(_float);

4

示例代码:

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

1)正如预期的那样返回 true
2)与上述情况相同
3)false - 因为我们使用了 Equals(object),它会在内部进行检查:

  public override bool Equals(Object obj) {
        if (!(obj is Single)) {
            return false;
        }
        ...

4) true? why?

public override bool Equals(Object obj) {
        if (!(obj is Double)) {
            return false;
        }

float 如何通过这个 if 保护?

2个回答

5

它并没有。

在第4种情况下使用的重载是double.Equals(double obj)。这是因为从floatdouble存在隐式转换。

在第3种情况下,从doublefloat没有隐式转换,因为这可能会导致精度损失。在这种情况下,double将被装箱,您将使用object.Equals

您可以通过将其强制转换为对象来显示object.Equals的实际结果:

d.Equals((object)f)).Dump(); // this will be false

请看这个示例

你可以使用 (d.Equals((object)f)).Dump(); 调用 Equals(object) 方法并验证答案。 - D Stanley
@DStanley,没错,那在fiddle中。我会将代码添加到答案中,这可能更有帮助。谢谢! - Charles Mager

3

这个函数被称为public bool Equals(Double 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),因此感谢这种转换功能。

1
又是我问的一个愚蠢的问题 :( 我把光标移到“Equals”上,我发誓在Visual Studio的工具提示中看到了“Equals(object obj)”。猜想今天工作太久了 :) - apocalypse
1
@zgnilec 有时候,VS并不像我们希望的那样智能,你可能已经见过了。 - Thomas Ayoub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接