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 ;-)

questionAnswers(2)

yourAnswerToTheQuestion