Область действия локальной переменной в анонимном методе linq (закрытие)

Какова область действия локальной переменной, объявленной в Linq Query.

Я писал следующий код

   static void Evaluate()
    {
        var listNumbers = Enumerable.Range(1, 10).Select(i => i);
        int i = 10;
    }

Компилятор отметил ошибку в строке int i=10, заявив

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else 

Я не могу понять, почему возникает эта ошибка.

Насколько я понимаю, iвыйдет за рамки после первой строки (в цикле foreach). Итак, iможно объявить снова.

Фактическое поведение заключается в том, что iне может быть доступен после первой строки (в цикле foreach), что правильно. Но iнельзя объявить снова. Это кажется странным.

РЕДАКТИРОВАТЬ Это следующий вопрос, основанный на ответе Андраса. Ответ очень хороший, но вызывает дополнительные сомнения.

  static void Evaluate3()
    {
        var listNumbers = Enumerable.Range(1, 10).Select(i => i);
        var listNumbers1 = Enumerable.Range(1, 10).Select(i => i);
    }

На основе логики функции Оцените, что .Select(i=>i) и int i=10, оба i, являются локальными для функционального блока и, следовательно, усложняют ошибку.

Функция Evaluate3 не должна компилироваться, так как в блоке методов есть два i, но она успешно компилируется без каких-либо предупреждений/ошибок.

Вопрос. Либо Evaluate, либо Evaluate3 не должны компилироваться, либо оба должны компилироваться.

6
задан Tilak 28 December 2012 в 22:33
поделиться