Следующий код не может скомпилировать: "Локальная переменная с именем" st "не может быть объявлена в этой области, потому что она придавала бы значение" st ", которое уже используется в области" child ", чтобы обозначить что-то еще":
var l = new List<string>();
l.Find(st => st.EndsWith("12"));
string st = "why this fails?";
Я понимаю, почему это не сработает:
string preParent = "";
{
string preParent = "Should fail cause we change the meaning";
}
Когда мы делаем следующее, получаем "CS0103: имя" postParent "не существует в текущем контексте":
{
string postParent=string.Empty;
}
postParent = "Should this work?";
Я не понимаю, почему компилятор достаточно умен, чтобы увидеть, что postParent не входит в область видимости, но не позволит мне определить новую переменную, которая имеет то же имя, что и переменная, используемая в пределах дочерней области (которая очевидно, выходит за рамки этого пункта).
Является ли компилятор простой областью применения, отказываясь позволить мне использовать переменную? Если это так, это имеет смысл.
===========
Отредактировано:
Я думаю, что интересным является то, как вы можете иметь одну и ту же переменную в двух дочерних областях в одном методе, поэтому это действительно:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
Мне просто любопытно, что у вас могут быть две переменные с тем же именем, если они находятся на одном уровне (если вы посмотрите на область как дерево). Это имеет смысл, потому что вы можете иметь локальные переменные в двух методах одного и того же класса с тем же именем.
Я просто удивлен, что компилятор способен дифференцировать и разрешить это, в то время как он не позволит переменную postParent. И это техническое ограничение или это дизайнерское решение? Это то, к чему я действительно пытаюсь добраться, -)