CS0133"分配给'标识符'的表达式必须是常量" - 这背后的原因是什么?

sha*_*oth 22 .net c#

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

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

我希望在C#中也能正常工作.然而...

byte[] buffer = new byte[4];
const int count = buffer.Length;
Run Code Online (Sandbox Code Playgroud)

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

我不明白.为什么这个无效?int是一种价值类型,不是吗?为什么我不能这样分配值并使变量不可更改?

jal*_*alf 25

因为const在C#中constconst在C++中要多得多.;)

在C#中,const用于表示编译时常量表达式.它类似于这个C++代码:

enum {
  count = buffer.Length;
}
Run Code Online (Sandbox Code Playgroud)

因为buffer.Length在运行时进行求值,所以它不是常量表达式,因此会产生编译错误.

C#有一个readonly与C++有点相似的关键字const.(虽然它仍然有限,并且在C#中没有const-correctness这样的东西)

  • 在C#中,您无法表达"允许函数A修改此对象,但函数B应以只读方式访问它".您可以公开List <T>和*hope*被调用者不会修改它.或者你可以公开数据的副本,或者你可以使用像ReadOnlyCollection <T>`这样的人为设计和残缺的界面.但你真正想要的只是像这样定义函数B:`void B(const List <T> myList)`:一个列出并承诺将其视为const的函数 (4认同)
  • @ruffin:在C#中,const和readonly只能应用于类成员.在C++中,const并不意味着"编译时常量",而是"不会被修改".你可以有const成员方法(意思是它们不会修改它们所属的类,因此,如果你有一个const对象,你只能在它上面调用const方法.函数参数可以是const,(再次,意味着被调用的函数不能修改参数,或者在其上调用非const成员函数). (2认同)
  • 这允许您创建"const-correctness"的概念.也就是说,您可以区分"修改"和"非修改"函数,并在编译时检测是否意外尝试对const对象执行修改操作.您可以定义一个类来限制可以对其执行的操作(如果它是const),并且如果您在整个程序中一致地执行,则它是const-correct.任何违反"逻辑"常量的尝试都会成为编译时错误. (2认同)

Jon*_*eet 11

const 用于表示编译时常量...而不仅仅是只读值.

我不敢在C#中指定只读但非编译时常量的局部变量.一些局部变量本质上是只读的 - 例如循环中的迭代变量foreach以及在using语句的fisrt部分中声明的任何变量.但是,您无法创建自己的只读变量.

如果const在方法中使用,则有效地将该标识符的任何用法替换为编译时常量值.就个人而言,我很少看到这在真正的C#代码中使用过.


Ode*_*ded 5

您无法为a分配变量编号const.它是一个编译时常量.

const上的C#引用:

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