不允许在for循环内和for循环外定义具有相同名称的变量的原因是,因为外部作用域内的变量在内部作用域内有效。意味着如果允许的话,for循环中将有两个“ i”变量。
请参阅:MSDN范围
特别:
在local-variable-declaration(第8.5.1节)中声明的局部变量的范围是声明所在的块。
和
在for语句的for-initializer中声明的局部变量的范围(第8.8.3节)是for初始化器,for-condition,for-iterator和for语句包含的语句。
并且:局部变量声明(C#规范的8.5.1节)
特别:
在local-variable-declaration中声明的局部变量的范围是声明所在的块。在文本位置引用局部变量的局部变量声明符之前的局部变量是错误的。在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误。
(强调我的。)
这意味着i
for循环内部的范围就是for循环。而i
for循环外部的范围是整个主要方法加上 for循环。这意味着您将i
在循环中出现两次,根据上述情况,这是无效的。
不允许您这样做int A = i;
的原因int i
是,仅在for
循环内使用。因此,不再可以在for
循环外部访问它。
如您所见,这两个问题都是范围界定的结果;第一个问题(int i = 4;
)将在循环范围i
内产生两个变量for
。而int A = i;
将导致访问超出范围的变量。
相反,您可以做的是声明i
要作用于整个方法,然后在方法和for循环作用域中使用它。这样可以避免违反任何一条规则。
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
// 'i' is only declared in the method scope now,
// no longer in the child scope -> valid.
i = 4;
// 'i' is declared in the method's scope -> valid.
int A = i;
}
编辑:
当然,可以更改C#编译器以允许此代码相当有效地进行编译。毕竟这是有效的:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
但是能够编写如下代码对您的代码可读性和可维护性真的有好处:
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
考虑一下这里可能出现的错误,最后i
打印的是0还是4?现在,这是一个非常小的示例,很容易跟踪和跟踪,但是与i
使用不同名称声明外部相比,它绝对缺乏可维护性和可读性。
注意:
请注意,C#的范围规则与C ++的范围规则不同。在C ++中,变量仅在声明变量直至块结束的范围内。这将使您的代码成为C ++中的有效构造。