我最近尝试回答用户发布的一个问题,关于为什么
线程在这里继续解开,因为我看不到这样的编译如何在C#规则下合法——因为虽然它仍然是技术上的常量,但编译器认为它不是,并且会给出一个错误
decimal
结构体不像其他数字原始类型一样声明其Min/Max值为const
; 相反,Microsoft文档指出它是static readonly.
在研究中,我查看了Microsoft源代码,并发现了一个有趣的发现; 源代码(.NET 4.5)让它看起来像一个const
,这与文档明确说明相反(源代码和相关结构体构造函数如下所示)。public const Decimal MinValue = new Decimal(-1, -1, -1, true, (byte) 0);
public const Decimal MaxValue = new Decimal(-1, -1, -1, false, (byte) 0);
public Decimal(int lo, int mid, int hi, bool isNegative, byte scale)
{
if ((int) scale > 28)
throw new ArgumentOutOfRangeException("scale", Environment.GetResourceString("ArgumentOutOfRange_DecimalScale"));
this.lo = lo;
this.mid = mid;
this.hi = hi;
this.flags = (int) scale << 16;
if (!isNegative)
return;
this.flags |= int.MinValue;
}
线程在这里继续解开,因为我看不到这样的编译如何在C#规则下合法——因为虽然它仍然是技术上的常量,但编译器认为它不是,并且会给出一个错误
The expression being assigned to ... must be constant
。因此,我相信文档之所以称其为static readonly
的原因就在于此。
现在,这引出了一个问题:这个文件来自Microsoft源服务器,实际上是decimal的源代码,还是经过篡改?我有什么遗漏吗?