同じ名前の変数がすでにある関数内で宣言されたアクションのパラメーターとして変数名を誤って再利用するコードを最近書きました。例えば:
var x = 1;
Action<int> myAction = (x) => { Console.WriteLine(x); };
重複を見つけたとき、コードが完全にコンパイルされて実行されたことに驚きました。これは、C#のスコープについて知っていることに基づいて期待する動作ではありません。Laogda Scope Clarificationなど、いくつかの簡単なグーグル検索により、同様のコードがエラーを生成することを訴えるSOの質問が表示されました。(念のため、サンプルコードをIDEに貼り付けて、実行されるかどうかを確認しました。完全に実行されます。)さらに、Visual Studioで[名前の変更]ダイアログに入ると、最初の名前が名前の競合として強調表示されます。x
このコードはなぜ機能するのですか?Visual Studio 2019でC#8を使用しています。
x
メソッドに移動されるため、そのメソッドのパラメーター全体がスコープの外に移動されます。例については、sharplabを参照してください。