Lambda变量范围

时间:2010-06-28 15:20:47

标签: c# lambda scoping

示例:

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

var s = "s";

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

1 个答案:

答案 0 :(得分:8)

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

A local variable named 's' cannot be declared in this scope because it
would give a different meaning to 's', which is already used in a 
'child' scope to denote something else

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

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

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

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