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