Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CS0133“;指定给';标识符';必须是常数";-什么';这背后的原因是什么? 随着大量C++背景的出现,我习惯于编写以下内容: const int count = ...; //some non-trivial stuff here for( int i = 0; i < count; i++ ) { ... }_C#_.net - Fatal编程技术网

C# CS0133“;指定给';标识符';必须是常数";-什么';这背后的原因是什么? 随着大量C++背景的出现,我习惯于编写以下内容: const int count = ...; //some non-trivial stuff here for( int i = 0; i < count; i++ ) { ... }

C# CS0133“;指定给';标识符';必须是常数";-什么';这背后的原因是什么? 随着大量C++背景的出现,我习惯于编写以下内容: const int count = ...; //some non-trivial stuff here for( int i = 0; i < count; i++ ) { ... },c#,.net,C#,.net,生成错误CS0133:指定给“count”的表达式必须为常量 我不明白。为什么这是无效的int是一种值类型,不是吗?为什么我不能这样赋值并使变量不可更改?const表示编译时常量。。。不仅仅是一个只读值 恐怕不能在C#中指定只读但非编译时常量的局部变量。某些局部变量本质上是只读的-例如foreach循环中的迭代变量以及使用语句在的第一部分声明的任何变量。但是,您不能创建自己的只读变量 如果在一个方法中使用const,这将有效地用编译时常量值替换该标识符的任何用法。就我个人而言,我很少在真正的C#

生成错误CS0133:指定给“count”的表达式必须为常量


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

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

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


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

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

从C#参考中:

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


因为在C++中,<>代码> const <代码>比 > const >在C++中有更多的代码< >代码>;p> 在C#中,

const
用于表示编译时常量表达式。它类似于C++代码:

enum {
  count = buffer.Length;
}
因为
buffer.Length
是在运行时计算的,所以它不是一个常量表达式,因此会产生编译错误

C#有一个
只读
关键字,它与C++的
常量
更为相似。(尽管它仍然非常有限,而且C#中没有常量正确性)

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


微软可能应该在《C#参考指南》中更具体一些:

与我对const的期望相比,它的局限性是什么?哦,我不确定我是否遵循了维基百科对“常量正确性”的定义。只是它在适当的地方使用const?readonly是如何保证正确性的?@ruffin:在C#中,const和readonly只能应用于类成员。在C++中,const并不意味着“编译时常数”,而是“不被修改”。您可以有const成员方法(这意味着它们不修改它们所属的类,因此,如果您有一个const对象,则只允许对其调用const方法。函数参数可以是const,(同样,这意味着被调用的函数不能修改参数,或对其调用非const成员函数)。这允许您创建“常量正确性”的概念。也就是说,您可以区分“修改”和“非修改”函数,并在编译时检测您是否意外尝试对常量对象执行修改操作。您可以定义一个类来限制在常量对象上可以执行的操作,如果在整个程序中始终这样做,则该类是常量正确的。任何违反“逻辑”的尝试constness成为编译时错误。在C#中,您无法表示“允许函数a修改此对象,但函数B应以只读方式访问此对象”。您可以公开一个列表,并希望被调用方不会修改它。或者您可以公开数据的副本,或者您可以使用一些精心设计的、有缺陷的接口,如
ReadOnlyCollection
。但您真正想要的只是像这样定义函数B:
void B(const List myList)
:一个列出并承诺将其视为常量的函数。谢谢。如果我还没有投票,我现在显然会。我被困在VB6常量使用区,在那里你(我?)大多只固定字符串和int(有时,甚至生活在模块中)因此,没有人会意外更改它们或错误键入它们的值。显然,只读解决了这一问题。函数级参数常量约束(等等,超出简单的not ByRef保护)将非常棒。感谢您的精彩解释和快速回复。允许使用局部常量,如Jon Skeet的回答中所述。
enum {
  count = buffer.Length;
}