次のコードは、「'st' という名前のローカル変数は、このスコープでは宣言できません。これは、'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: The name 'postParent' does not exist in the current context」が表示されます。
{
string postParent=string.Empty;
}
postParent = "Should this work?";
私が得られないのは、コンパイラが postParent がスコープ内にないことを確認できるほどスマートであるのに、子スコープ内で使用される変数と同じ名前の新しい変数を定義させない理由です (これは明らかにアウトです)この時点での範囲)。
コンパイラは、変数の使用を拒否することで単純にスコープを強制していますか? もしそうなら、これは理にかなっています。
===========
編集:
私が興味深いと思うのは、1 つのメソッドで 2 つの子スコープ内で同じ変数を使用する方法です。これは有効です。
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
同じレベルにある限り、同じ名前の 2 つの変数を使用できることに少し興味があります (スコープをツリーとして見る場合)。同じ名前の同じクラスの 2 つのメソッドでローカル変数を使用できるため、これは理にかなっています。
postParent 変数を許可しない一方で、コンパイラがこれを区別して許可できることに驚いています。これは技術的な制限ですか、それとも設計上の決定ですか? それが私が本当に達成しようとしていることです;-)