Lambda变量作用域

8

例子:

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

var s = "s";

在lambda表达式中定义了一个变量“s”,在同一方法中又定义了另一个名为“s”的局部变量。当我将光标悬停在第一个“s”上时,Visual Studio告诉我“下面定义了一个冲突的变量”。为什么会有冲突呢?Lambda表达式中的“s”显然在其封闭括号之外是不可用的。

请参见:http://blogs.msdn.com/b/ericlippert/archive/2009/11/02/simple-names-are-not-so-simple.aspx - Anthony Pegram
1个回答

9
它们是冲突的,因为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有两个不同的含义,但当代码有数百行时,就不那么容易了。

有关此规则的更多信息,请参见:

链接


嗯,我记得你的帖子里有些东西。感谢你纠正我。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接