基本上如标题所述,如果我这样做:
private const string TYPEOF_STRING = typeof(String).FullName;
为什么它会给我错误:
分配给的表达式 'Cognitronics.Generic.CloudClient.TYPEOF_STRING'必须是常量
编辑:
似乎我们在这里和Habib链接的线程中都有相互矛盾的答案。这里每个人都说它不是编译时间常数,而在另一个线程中每个人都说它是。这让我更加困惑,所以我想重新问一下这是什么?
答案 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)
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;