为什么这不恒定?

时间:2015-05-06 13:22:23

标签: c#

基本上如标题所述,如果我这样做:

private const string TYPEOF_STRING = typeof(String).FullName;

为什么它会给我错误:

  

分配给的表达式   'Cognitronics.Generic.CloudClient.TYPEOF_STRING'必须是常量

编辑:

似乎我们在这里和Habib链接的线程中都有相互矛盾的答案。这里每个人都说它不是编译时间常数,而在另一个线程中每个人都说它是。这让我更加困惑,所以我想重新问一下这是什么?

4 个答案:

答案 0 :(得分:13)

的值
typeof(String).FullName 

不是编译时常量,代码必须执行才能知道这个值。

答案 1 :(得分:1)

Const 表示它在编译时是常量,您的代码需要运行

如果您希望在运行时使用只读

official site中所述: -

  

虽然 const 字段是编译时常量,但只读字段   可用于运行时常量,如下所示:public static   readonly uint l1 =(uint)DateTime.Now.Ticks;

你刚刚学会了一个常见的面试问题;)

答案 2 :(得分:0)

typeof(string)返回类型为System.Type的对象,您正在访问该对象的属性。对象在编译时不存在,因此在编译时不能确定它们的属性值是常量。 Fullname作为抽象属性也意味着无法确保Fullname是常量。因此,即使知道第一个表达式总是会产生相同的结果,也不足以确定Fullname的值是常量

以下是typeof(int)

生成的IL
ldtoken int32
call class [mscorlib]System.Type
     [mscorlib]System.Type::GetTypeFromHandle(valuetype
     [mscorlib]System.RuntimeTypeHandle)

包括对方法的调用,因此显然不是恒定的。

答案 3 :(得分:0)

要使用const关键字,编译器必须能够计算编译时分配的值。如果在运行时计算,则应使用readonly关键字。

两者都是常量,只要值不能改变。

因此要声明你的常量,请使用:

private readonly string typeOfString = typeof(String).FullName;