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

时间:2010-08-03 08:38:52

标签: c# .net

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

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

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

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

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

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

4 个答案:

答案 0 :(得分:23)

因为C#中的const比C ++中的const要多const。 ;)

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

enum {
  count = buffer.Length;
}

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

C#有readonly个关键字,与C ++的const更相似。 (虽然它仍然有限,但在C#中没有const-correctness这样的东西)

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:5)

您无法为const分配变量编号。这是一个编译时常量。

来自const上的C#参考:

  

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

答案 3 :(得分:2)

另请注意,在C#中,修饰符readonly仅适用于成员变量,适用于局部变量(即在方法中定义)。

Microsoft可能应该在C#参考指南中更具体:
http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx