Po zobaczeniu, jak double.Nan == double.NaN
jest zawsze fałszywa w C#, zacząłem się zastanawiać, w jaki sposób wprowadzono równość pod maską. Więc użyłem ReSharper dekompilować podwójne struct, i oto co znalazłem:Kiedy system nie jest podwójny?
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
Wydaje się to wskazywać struct Double
deklaruje stałą zdefiniowaną w kategoriach tego szczególnego małymi literami double
, chociaż ja” d zawsze myślał, że te dwie są całkowicie synonimiczne. Co więcej, jeśli przejdę do implementacji małymi literami, Resharper po prostu przewinie mnie do deklaracji na górze pliku. Podobnie, przejście do implementacji małej litery NaN
po prostu prowadzi mnie do stałej deklaracji wcześniej w linii!
Próbuję zrozumieć tę pozornie rekursywną definicję. Czy to tylko artefakt dekompilatora? Być może ograniczenie w Resharperze? Czy może to podwójne dno jest zupełnie inną bestią - reprezentującą coś na niższym poziomie od CLR/CTS?
Skąd naprawdę pochodzi NaN
?
Czy to jest powiązane? http://stackoverflow.com/questions/4751885/how-are-the-primitive-types-defined-non-recursively A także http://stackoverflow.com/questions/16113850/if-int32-is-just-an -alias-for-int-how-can-the-int32-class-use-an-int –
Po prostu używając VS, aby wyświetlić metadane pokazuje 'public const double NaN = 0.0/0.0;' –
'NaN' oznacza' Not a Liczba' i może być dodatnia lub ujemna, podobnie jak 'Nieskończoność'. Na wypadek, gdyby ktoś się zastanawiał. – Nolonar