2016-06-07 8 views
4

Beispielcode:_double.Equals (_float);

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) gibt true zurück, als
2) gleiche erwartet, wie oben
3) falsch - weil wir Equals(object) verwenden und prüft intern:

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

4) wahr? Warum?

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

Wie float diese if Wache passieren kann?

Antwort

3

Die aufgerufene Funktion ist public bool Equals(Double obj) (statt public override bool Equals(Object obj)), das ist:

public bool Equals(Double obj) 
{ 
    if (obj == m_value) { 
     return true; 
    } 
    return IsNaN(obj) && IsNaN(m_value); 
} 

Dank der impliziten Besetzung von float zu Double

+1

0_0 Noch eine blöde Frage von mir :(Ich habe Cursor über Equals bewegt, und ich schwöre, ich sah Equals (Objekt Obj) in Tool-Tipp in Visual Studio. Vermutung, ich bin zu lange in der Arbeit heute :) – zgnilec

+1

@zgnilec manchmal VS ist nicht so intelligent, wie wir es gerne hätten und das hast du wahrscheinlich gesehen. –

5

Es tut es nicht.

Die Überlast, die Sie in Fall 4 verwenden, ist double.Equals(double obj). Dies liegt daran, dass eine implizite Konvertierung von float zu double erfolgt.

In Fall 3 gibt es keine implizite Konvertierung von double zu float, da dies zu einem Genauigkeitsverlust führen kann. In diesem Fall wird double eingerahmt und Sie verwenden object.Equals.

Sie können das tatsächliche Ergebnis von object.Equals zeigen, indem sie zum Objekt Gießen:

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

this fiddle See.

+0

können Sie 'verwenden (d.Equals ((Objekt) f)) .Dump(); 'um das Objekt.Equals (Objekt)' Methode aufzurufen und die Antwort zu verifizieren. –

+0

@DStanley yep, das ist in der Geige. Ich füge den Code der Antwort hinzu, da dies wahrscheinlich hilfreicher ist. Vielen Dank! –

+0

Danke für die Antwort. – zgnilec