Nachdem ich gesehen habe, wie double.Nan == double.NaN
in C# immer falsch ist, wurde ich neugierig, wie die Gleichheit unter der Haube umgesetzt wurde. So habe ich ReSharper die Doppel-Struktur zu dekompilieren, und hier ist das, was ich gefunden habe:Wann ist ein System.Double kein Double?
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
Dies scheint darauf hinzudeuten die die Struktur Double
eine Konstante erklärt, die in Bezug auf diese spezielle Kleinschreibung definiert ist double
, obwohl ich Ich dachte immer, dass die beiden auch komplett sind. Wenn ich die Implementation in der Kleinbuchstaben-Doppelfunktion verwende, scrollt Resharper einfach zu der Deklaration am Anfang der Datei. In ähnlicher Weise führt das Springen zur Implementierung des Kleinbuchstabens NaN
mich nur zur konstanten Erklärung früher in der Linie!
Also versuche ich diese scheinbar rekursive Definition zu verstehen. Ist das nur ein Artefakt des Decompilers? Vielleicht eine Einschränkung in Resharper? Oder ist dieser Kleinbuchstabe tatsächlich ein ganz anderes Biest, das etwas von der CLR/CTS repräsentiert?
Woher kommt eigentlich NaN
?
Ist das verwandt? http://stackoverflow.com/questions/4751885/how-are-the-primitive-types-defined-non-recursively Und auch http://stackoverflow.com/questions/16113850/if-int32-is-just-an -alias-for-int-wie-kann-der-int32-class-use-an-int –
Wenn Sie VS verwenden, um die Metadaten anzuzeigen, zeigt 'public const double NaN = 0.0/0.0;' –
'NaN' bedeutet' Nicht a Number 'und kann positiv oder negativ sein, genau wie' Infinity '. Falls sich jemand fragt. – Nolonar