7

例子:

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

var s = "s";

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

4

1 回答 1

8

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

不能在此范围内声明名为“s”的局部变量,因为它
会给's'赋予不同的含义,它已经在a中使用过
'child' 范围来表示其他东西

C# 不允许您在同一个块中使用相同的简单名称来表示两件事,因为这样做会使代码容易出错、难以编辑、难以阅读、难以重构和难以调试。最好禁止这种糟糕的编程实践,而不是允许它并冒着导致错误的风险,因为您假设“s”在整个块中表示相同的东西。

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

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

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

于 2010-06-28T16:40:06.573 回答