Escopo filho & CS0136
O código a seguir falha ao compilar informando "Uma variável local chamada 'st' não pode ser declarada neste escopo porque daria um significado diferente a 'st', que já é usado em um escopo 'filho' para indicar outra coisa":
var l = new List<string>();
l.Find(st => st.EndsWith("12"));
string st = "why this fails?";
Entendo por que isso não vai funcionar:
string preParent = "";
{
string preParent = "Should fail cause we change the meaning";
}
Quando fazemos o seguinte, obtemos "CS0103: O nome 'postParent' não existe no contexto atual":
{
string postParent=string.Empty;
}
postParent = "Should this work?";
O que eu não entendo é por que o compilador é inteligente o suficiente para ver que postParent não está dentro do escopo, mas não me permite definir uma nova variável que tenha o mesmo nome que uma variável usada no escopo filho (o que obviamente está fora de escopo neste momento).
O compilador é simples para aplicar o escopo, recusando-me a usar a variável? Se sim, isso faz sentido.
===========
Editado:
Eu acho que o que também acho interessante é como você pode ter a mesma variável em dois escopos filho em um único método, portanto isso é válido:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
Estou um pouco curioso que você pode ter duas variáveis com o mesmo nome, desde que estejam no mesmo nível (se você olhar o escopo como uma árvore). Isso faz sentido porque você pode ter variáveis locais em dois métodos da mesma classe com o mesmo nome.
Estou surpreso que o compilador seja capaz de diferenciar e permitir isso, embora não permita a variável postParent. E isso é uma limitação técnica ou foi uma decisão de design? É isso que eu realmente estou tentando entender ;-)