Когда система. Двойной не двойной?
Посмотрев какdouble.Nan == double.NaN
всегда ложно в C #, мне стало любопытно, как было реализовано равенство под капотом. Поэтому я использовал Resharper для декомпиляции структуры Double, и вот что я нашел:
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
Это, кажется, указывает на структуруDouble
объявляет константу, которая определяется в терминах этого специального нижнего регистраdouble
Хотя я всегда думал, что эти два были полностью синонимами. Более того, если я перейду к реализации в нижнем регистре, Resharper просто прокрутит меня до объявления в верхней части файла. Аналогично, переход к реализации строчныхNaN
просто приводит меня к объявлению константы ранее в строке!
Поэтому я пытаюсь понять это, казалось бы, рекурсивное определение. Это просто артефакт декомпилятора? Возможно ограничение в Resharper? Или этот строчный дубль на самом деле совсем другой зверь - представляющий что-то на более низком уровне от CLR / CTS?
Где жеNaN
действительно пришел?