1 回答
TA贡献1809条经验 获得超8个赞
从运行时的角度来看,它不是一个常量- 因为 CLR 基本上不知道decimal; 它不是原始类型。这就是你不能在属性中使用小数的原因。
如果您查看这些字段的 IL,您可以看到以下内容:
.field public static initonly valuetype [mscorlib]System.Decimal DecimalConstant
.custom instance void [mscorlib]System.Runtime.CompilerServices.DecimalConstantAttribute::.ctor
(uint8, uint8, uint32, uint32, uint32) =
(01 00 00 00 00 00 00 00 00 00 00 00 63 00 00 00 00 00)
.field public static literal string StringConstant = "StringConstant"
.field public static literal int32 IntConstant = int32(0x00000001)
.field public static literal float64 DoubleConstant = float64(1.)
请注意如何为其他常数的IL确实有literal它,但DecimalConstant没有。相反,它只是一个应用了属性的只读字段。该属性允许其他编译器将该字段视为常量并知道其值 - 例如,它可以出现在其他 const 表达式中。
然后有一个类型初始化器来在执行时设置字段值:
.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
{
// Code size 13 (0xd)
.maxstack 8
IL_0000: ldc.i4.s 99
IL_0002: newobj instance void [mscorlib]System.Decimal::.ctor(int32)
IL_0007: stsfld valuetype [mscorlib]System.Decimal Program::DecimalConstant
IL_000c: ret
} // end of method Program::.cctor
同样,这只是DecimalConstant因为运行时直接处理其他字段而存在。
- 1 回答
- 0 关注
- 162 浏览
添加回答
举报