循环中的局部范围矛盾

时间:2016-08-26 14:14:33

标签: c# loops compiler-errors

我很困惑为什么会出现编译器错误 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;
    }

这里是否有任何矛盾?为什么要对此进行限制?

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;