例:
myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh");
var s = "s";
変数「s」はラムダで定義され、別の変数「s」は同じメソッド内のローカル変数として定義されます。最初の「s」にカーソルを合わせると、Visual Studio から「競合する変数が以下に定義されています」と表示されます。これらが矛盾するのはなぜですか。ラムダの「s」は、括弧の外では使用できませんか?
C# の規則では、同じ単純な名前を 2 つ使用して、それらのいずれかを直接囲むブロック内の2 つの異なるものを参照することはできないため、それらは競合しています。あなたの例では、単純な名前「s」は、ローカル変数宣言を囲むブロック内の2つのことを意味するために使用されています.ローカル変数とラムダパラメータを意味します. それこそが違法です。表示されるエラー メッセージが次のことを示していることに注意してください。
's' という名前のローカル変数は、このスコープでは宣言できません。 で既に使用されている「s」に別の意味を与えます。 何か他のものを示すための「子」スコープ
C# では、同じ単純な名前で同じブロック内の 2 つのことを意味することはできません。これを行うと、コード エラーが発生しやすくなり、編集しにくくなり、読みにくくなり、リファクタリングしにくくなり、デバッグしにくくなります。ブロック全体で「s」が同じ意味であると想定したために、この悪いプログラミング手法を許可してバグを引き起こす危険を冒すよりも、許可しない方がよいでしょう。
コードの長さが 2 行しかない場合、s には 2 つの異なる意味があることを覚えるのは簡単ですが、数百行の長さになると、それほど簡単ではありません。
このルールの詳細については、次を参照してください。
http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx