В следующем коде не удается скомпилировать, утверждая, что "локальная переменная с именем" st "не может быть объявлена в этой области, поскольку она придала бы другое значение" st ", который уже используется в" дочерней "области для обозначения чего-то другого" ":
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. И это техническое ограничение или это было дизайнерское решение? Вот к чему я действительно стремлюсь; -)