Dopo aver visto come double.Nan == double.NaN
è sempre falso in C#, sono diventato curioso di sapere come l'uguaglianza è stata implementata sotto il cofano. Così ho usato ReSharper per decompilare il doppio struct, ed ecco cosa ho trovato:Quando è un System.Double non un doppio?
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
Questo sembra indicare la struct Double
dichiara una costante che viene definita in termini di questo speciale minuscole double
, anche se' Ho sempre pensato che i due fossero completamente sinonimi. Per di più, se vado all'implementazione sul doppio minuscolo, Resharper semplicemente scorre me alla dichiarazione nella parte superiore del file. Allo stesso modo, passare all'implementazione di NaN
in minuscolo mi porta alla dichiarazione costante nella riga precedente!
Quindi sto cercando di capire questa definizione apparentemente ricorsiva. Questo è solo un artefatto del decompilatore? Forse una limitazione in Resharper? Oppure questo doppio minuscolo in realtà è una bestia completamente diversa - rappresenta qualcosa di più basso dal CLR/CTS?
Da dove proviene veramente lo NaN
?
È correlato? http://stackoverflow.com/questions/4751885/how-are-the-primitive-types-defined-non-recursively E anche http://stackoverflow.com/questions/16113850/if-int32-is-just-an -alias-per-int-how-can-the-int32-class-use-an-int –
Basta usare VS per visualizzare i metadati mostra 'public const double NaN = 0.0/0.0;' –
'NaN' significa' Not a Number' e può essere positivo o negativo, proprio come 'Infinity'. Nel caso qualcuno si stia chiedendo. – Nolonar