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