【发布时间】:2014-02-14 12:41:41
【问题描述】:
在 Visual Studio C# 编辑器中,当您右键单击关键字“double”或标识符“Double”并选择“Go to Definition”时,VS 会告诉您“NaN”的声明和初始化如下:
public const double NaN = 0.0 / 0.0;
//public const double NegativeInfinity = -1.0 / 0.0;
//public const double PositiveInfinity = 1.0 / 0.0;
但是,从 mscorlib.dll 反汇编的 System.Double 的源代码讲述了一个不同的故事:
public const double NaN = double.NaN;
//public const double NegativeInfinity = double.NegativeInfinity;
//public const double PositiveInfinity = double.PositiveInfinity;
当然,.NET 不允许您使用对自身的引用(循环定义)来初始化 const 字段或使用对自身的引用来初始化实例字段(不允许使用对实例字段的引用来初始化实例字段) ,虽然可以使用对自身的引用来初始化静态字段,但这里显然不是这种情况。
现在,大多数 .NET 书籍教导的第一件事是标识符“Double”和关键字“double”都引用相同的类型(int 和 Int32、string 和 String 等相同),并且对任何怀疑这一点的人来说,快速浏览一下 IL 就足以证明这一点。
考虑到这一点,为什么 System.Double 类型可以避免将 double 类型的常量字段初始化为自身?是不是这个意思,
...适用于仅由 .NET 程序员编写的代码的规则不适用于内部 .NET 代码? ...反汇编程序弄错了吗? ...“Double”和“double”真的不是同一类型吗?
【问题讨论】:
标签: c# .net il disassembly