在看到double.Nan == double.NaN
C# 中的总是 false 之后,我开始好奇相等是如何在幕后实现的。所以我使用 Resharper 反编译了 Double 结构,这是我发现的:
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
这似乎表明 structDouble
声明了一个根据这个特殊的小写字母定义的常量double
,尽管我一直认为这两者是完全同义的。更重要的是,如果我在小写双精度上转到实施,Resharper 只需将我滚动到文件顶部的声明。同样,跳转到小写字母的实现NaN
只是将我带到行前面的常量声明!
所以我试图理解这个看似递归的定义。这只是反编译器的产物吗?也许是 Resharper 的限制?或者这个小写双精度实际上是完全不同的野兽 - 代表 CLR/CTS 较低级别的东西?
NaN
真正来自哪里?