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

有很多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是一个值类型,不是吗? 为什么我不能这样分配值并使变量不可更改?

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

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

 enum { count = buffer.Length; } 

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

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

const表示编译时常量…而不仅仅是只读值。

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

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

您不能将变量编号分配给const 。 这是一个编译时常量。

从const上的C#引用:

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

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

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