c#中迭代器变量超出作用域

本文关键字:作用域 变量 迭代器 | 更新日期: 2023-09-27 18:11:29

为什么我用c#写这个呢:

for(int myVar = 0; myVar<10; myVar++)
{
//do something here
}
//then, if I try:
int myVar = 8;
//I get some error that the variable is already declared.
//but if I try:
Console.WriteLine(myVar);
//then I get the error that the variable is not declared.

我觉得有点混乱。有人知道为什么c#编译器这样做吗?

c#中迭代器变量超出作用域

这个规则,以及其他几个相关的规则,在Eric Lippert的博客文章中讨论过。

这里违反的特殊规则是:

2)在同一个局部变量声明空间或嵌套的局部变量声明空间中有两个同名的局部变量是非法的

特别要注意的是,关于这些规则存在的原因是以下段落:

所有这些规则的目的是防止代码的读者/维护者被欺骗,认为他们引用了一个具有简单名称的实体,但实际上意外地完全引用了另一个实体的这类错误。这些规则是特别设计来防止在执行应该是安全的重构时出现意外情况的。

通过允许您所描述的,它可以导致看似良性的重构,例如将for循环移动到另一个声明之后,从而导致截然不同的行为。

不能在这个作用域中声明名为'myVar'的局部变量,因为它会赋予'myVar'不同的含义,而'myVar'已经在'子'作用域中用来表示其他东西了。

两个变量声明在同一作用域中。(在子作用域中的一个仍然不允许声明它两次)您不能第二次声明该变量。
改变作用域将允许你第二次声明它。

private void myMethod()
{
   //Start of method scope 
   for (int myVar = 0; myVar < 10; myVar ++)
   {
      //Start of child scope
      //End of child scope
   }
   //End of method scope
}
private void anotherMethod()
{
   // A different scope 
   int myVar = 0 
}

您所指的already declared的错误是相当描述性的,并说…

不能在此范围内声明名为'myVar'的局部变量因为它会给'myVar'一个不同的含义,它已经在'子'作用域中用于表示其他内容

myVar实际上不是'声明'当你试图使用它的第二次

看起来很奇怪,但是c#提供了简单地使用一些花括号来分隔一些代码行,就像这样:

for(int myVar = 0; myVar<10; myVar++)
{
//do something here
}
{
   //then, if I try:
   int myVar = 8;
   //I get some error that the variable is already declared.
   //but if I try:
   Console.WriteLine(myVar);
   //then I get the error that the variable is not declared.
}