【问题标题】:Why is this not constant?为什么这不是恒定的?
【发布时间】:2015-05-06 13:22:23
【问题描述】:

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

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

为什么它给我的错误:

被赋值的表达式 'Cognitronics.Generic.CloudClient.TYPEOF_STRING' 必须是常量

编辑:

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

【问题讨论】:

  • 嗯...这不是很明显吗?
  • @Robert,显然不是,否则为什么 OP 会问他的问题?将“const”关键字限制为仅编译时的常量是特定于语言的功能。
  • @Robert,其实不是,typeof is resolved at compile time
  • @Habib 如果在编译时解决了,为什么它不起作用呢?还是我很傻?
  • @habib typeof(T) 不是编译时间常数。这取决于。 Type foo<T>(){ return typeof(T); }

标签: c#


【解决方案1】:

价值

typeof(String).FullName 

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

【讨论】:

  • 我不知道,我以为它已经知道了。谢谢!
  • 有没有办法把它作为一个常数?还是只是尝试没有多大意义?
  • @TheLethalCoder 修改 CLR。祝你好运。
  • @TheLethalCoder Console.WriteLine(typeof(String).FullName)。复制粘贴。或者使用readonly 而不是const。将类型名称作为常量的目的是什么?
  • @TheLethalCoder 我想问你为什么要把它作为一个常数?
【解决方案2】:

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

如果需要在运行时使用只读

official site 中所述:-

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

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

【讨论】:

    【解决方案3】:

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

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

    所以要声明你的常量,使用:

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

    【讨论】:

      【解决方案4】:

      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)
      

      其中包括对方法的调用,因此显然不是常量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 2016-04-04
        相关资源
        最近更新 更多