代码之家  ›  专栏  ›  技术社区  ›  sharptooth

CS0133“分配给‘identifier’的表达式必须是常量”-这背后的原因是什么?

  •  21
  • sharptooth  · 技术社区  · 14 年前

    有很多C++背景,我已经习惯了写以下内容:

    const int count = ...; //some non-trivial stuff here
    for( int i = 0; i < count; i++ ) {
       ...
    }
    

    byte[] buffer = new byte[4];
    const int count = buffer.Length;
    

    生产 错误CS0133:分配给“count”的表达式必须是常量 .

    我不明白。为什么无效? int 是值类型,不是吗?为什么我不能赋值并使变量不可更改?

    4 回复  |  直到 14 年前
        1
  •  27
  •   Stack Overflow is garbage    14 年前

    因为 const 常数 常数 在C++中;

    在C#, 常数

    enum {
      count = buffer.Length;
    }
    

    因为 buffer.Length

    readonly 更类似于C++的关键字 常数 . (不过,它的局限性要大得多,而且在C#)中没有常量正确性

        2
  •  12
  •   Jon Skeet    14 年前

    const

    恐怕您不能在C#中指定只读但非编译时常量的局部变量。一些局部变量本质上是只读的,例如 foreach 循环的第一部分中声明的任何变量 using 声明。但是,不能创建自己的只读变量。

    如果你使用 在一个方法中,它有效地替换了 使用 具有编译时常量值的标识符。就我个人而言,我很少在真正的C代码中看到这种用法。

        3
  •  6
  •   Oded    14 年前

    你不能给一个变量赋值 const

    从上的C#参考 const :

    常量表达式是可以在编译时完全计算的表达式。

        4
  •  2
  •   sn00gan    11 年前

    还要注意,在C#中,修饰符 readonly 仅对成员变量可用, 对于局部变量(即在方法中定义的)。

    微软或许应该在《C参考指南》中更具体一些:
    http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx