Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么IsLiteral为十进制返回false?_C#_Reflection_Decimal_Constants - Fatal编程技术网

C# 为什么IsLiteral为十进制返回false?

C# 为什么IsLiteral为十进制返回false?,c#,reflection,decimal,constants,C#,Reflection,Decimal,Constants,以下程序将使用IsLiteral public static class Program { public static void Main(string[] args) { foreach (var field in typeof(Program).GetFields()) { System.Console.WriteLine(field.Name + " IsLiteral: " + field.IsLiteral);

以下程序将使用
IsLiteral

public static class Program
{
    public static void Main(string[] args)
    {
        foreach (var field in typeof(Program).GetFields())
        {
            System.Console.WriteLine(field.Name + " IsLiteral: " + field.IsLiteral);
        }

        System.Console.ReadLine();
    }

    public const decimal DecimalConstant = 99M;
    public const string StringConstant = "StringConstant";
    public const int IntConstant = 1;
    public const double DoubleConstant = 1D;
}
它适用于所有类型,除了
decimal
is将返回false


有人能解释这种行为吗?有没有更好的方法来判断一个字段是否是常量?

从运行时的角度来看,它不是常量-因为CLR基本上不知道十进制数;它不是一种原始类型。这就是为什么不能在属性中也使用小数

如果查看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
没有。相反,它只是一个应用了属性的只读字段。该属性允许其他编译器将该字段视为常量并知道其值,因此它可以出现在其他常量表达式中,例如

然后有一个类型初始值设定项在执行时设置字段值:

.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
同样,这只适用于
小数常量
,因为运行时直接处理其他字段。

作者:Jon Skeet。