Lambda变量范围

例:

myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh"); var s = "s"; 

变量“s”在lambda中定义,另一个变量“s”在同一方法中定义为局部变量。 当我将鼠标hover在第一个“s”上时,Visual Studio告诉我“下面定义了一个冲突的变量”。 为什么这些相互矛盾; lambda中的“s”肯定不在其封闭的支架之外?

它们是冲突的,因为C#的规则是任何两个使用相同简单名称的东西都不能用于引用块内的两个不同的东西 ,直接包含它们中的任何一个。 在您的示例中,简单名称“s”用于表示包含局部变量声明的块内的两个内容:它表示局部变量和lambda参数。 是非法的。 我注意到您收到的错误消息告诉您:

名为's'的局部变量不能在此范围内声明,因为它
会给's'赋予不同的含义,这已经在a中使用了 
 '孩子'范围表示别的东西

C#不允许你在同一个块中使用相同的简单名称意味着两件事,因为这样做会使代码容易出错,难以编辑,难以阅读,难以重构,难以调试。 最好不允许这种糟糕的编程习惯,而不是允许它,并冒着导致错误的风险,因为你认为“s”在整个块中意味着同样的事情。

当代码只有两行长时,很容易记住s有两种不同的含义,但是当它长达数百行时,就不那么容易了。

有关此规则的详细信息,请参阅:

http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx