我很困惑为什么会出现编译器错误 CS0136“无法在此范围内声明名为'a'的本地或参数,因为该名称用于封闭的本地范围以定义本地或参数”在那种循环中? 是不是第一个 a 包含在循环中?
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
int a = 0;
}
int a = 1;
}
如果没有,为什么有编译器错误CS0841在此变体中声明之前不能使用局部变量'b'
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
int a = b;
}
int b = 1;
}
这里是否有任何矛盾?为什么要对此进行限制?
答案 0 :(得分:0)
在第一个函数中,函数本身是一个变量范围。正如Sinatr所提到的,你可以声明一个封闭范围,但是这个范围不能与一般函数的范围相矛盾。正如John Skeet(Why can't a duplicate variable name be declared in a nested local scope?)所提到的,您的问题是编译器认为您在子范围内声明新a
的尝试实际上是非法尝试引用您的父a
,尚未宣布。
在第二个函数中,区别在于您在声明变量b
之前尝试解决它。你在打电话
int a = b;
在循环内,然后只有在循环结束后才调用
int b = 1;