Kiedy jest System.Double nie podwójne?
Po zobaczeniu jakdouble.Nan == double.NaN
jest zawsze fałszywy w C #, zaciekawiło mnie, jak została wprowadzona równość pod maską. Użyłem Resharper do dekompilacji struktury Double i oto co znalazłem:
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
To wydaje się wskazywać na strukturęDouble
deklaruje stałą, która jest zdefiniowana w odniesieniu do tej specjalnej małej literydouble
, choć zawsze myślałem, że te dwa są całkowicie synonimami. Co więcej, jeśli I Go To Implementation na podwójnej małej czcionce, Resharper po prostu przewinie mnie do deklaracji u góry pliku. Podobnie przeskakiwanie do implementacji małych literNaN
po prostu zabiera mnie do stałej deklaracji wcześniej w linii!
Próbuję więc zrozumieć tę pozornie rekurencyjną definicję. Czy to tylko artefakt dekompilatora? Być może ograniczenie w Resharper? Czy też ta mała litera podwaja zupełnie inną bestię - reprezentującą coś na niższym poziomie od CLR / CTS?
GdzieNaN
naprawdę pochodzi?