Звучит так, будто ты хочешь съесть свой торт и съесть его здесь. Некоторые переменные, объявленные во внутренней области видимости, должны «скрывать» идентичные переменные во внешней области видимости, в то время как другие не должны.
Звучит довольно легко для меня; если переменная объявлена во внутренней области видимости с идентичной сигнатурой (имя и тип), как и во внешней области видимости, компилятор должен разрешить этот «синтаксический сахар» и просто создать новую переменную, на которую фактически ссылается какое-то гибридное приложение в любом промежуточном коде используется (MSIL, JIL, сборка). Затем удалите объявление var из count, и большинство стандартов, касающихся области действия внутри метода, сделают эту работу именно так, как вы хотите. При желании вы можете потребовать использования ключевого слова «new» в объявлении внутренней переменной, чтобы подтвердить компилятору, что вы действительно хотите переменную с тем же именем, которая «скрывает» определение внешней области видимости. Таким образом, ваш фрагмент будет меняться только следующим образом:
var x = "foo";
var count = 0;
loop (/* condition */) {
var x = "bar"; //"hides" the outer x; maybe require "new" to confirm
print (x); // "bar"
count = count + 1; //works with the outer definition of count
}
print (x); // "foo"
print (count); // > 0