まず、奇妙さのテストが間違っています。
あなたの質問への答えは、あなたの質問の前提を否定することです。これはアルファ変換とは何の関係もありません。
また、「レキシカルスコープ」とは何の関係もありません.leppieは、私のレキシカルスコープの理解とは異なるものを意味しているようです。C# はレキシカル スコープの言語です。
ここで強調したいのは、C# で一方が他方を隠す 2 つの locals を宣言することは違法であることです。他のスコープに隠すことは完全に合法です。型パラメーターは外部の型パラメーターを隠すことができます (ただし、そうするのは非常にばかげています。そうしないでください。) フィールドは基本クラス フィールドを隠すことができます (ただし、その事実を強調するために、隠しフィールドを 'new' としてマークする必要があります)。 .) ローカルはメソッドを隠すことができます。等々。
ただし、(1) バグ ファームが作成され、(2) 単純な名前の使用に関するより一般的な規則に違反するため、ローカルは別のローカルを非表示にすることはできません。
名前に関するそのルールは、ここで興味深いルールです。これを行うと、同様のエラーが発生します。
class C
{
int n;
void M()
{
Console.WriteLine(n); // n means this.n
Func<double, double> f = n=>n; // n means the formal parameter
}
}
取得しているエラーは、単純な名前が最初に使用されるローカル スコープ全体で一貫した意味を持つ必要があるというC# の規則に違反しているためです。
「n」が 1 つの行で 1 つのことを意味し、次の行でまったく異なることを意味するプログラムは、混乱を招き、バグが発生しやすく、したがって違法です。
それを行いたい場合は、「n」の 2 つの意味が重複しないスコープ内にある必要があります。
class C
{
int n;
void M()
{
{
Console.WriteLine(n); // n means this.n
}
Func<double, double> f = n=>n; // n means the formal parameter
}
}
n の 2 つの使用法が重複しないスコープにあるため、これは合法です。
この問題はアルファ変換とは何の関係もありません。C# は、必要に応じてアルファ変換を適切に行います。
また、C# はレキシカル スコープであるため、この規則に違反しているとコンパイラが判断できます。これは、C# にレキシカル スコープがないという証拠ではありません。それは字句スコープを持っている証拠です。
このルールの詳細については、この件に関する私の記事を参照してください。
http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx