【问题标题】:Lambda variable scopeLambda 变量范围
【发布时间】:2010-06-28 15:20:46
【问题描述】:

例子:

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

var s = "s";

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

【问题讨论】:

标签: c# lambda scoping


【解决方案1】:

它们是冲突的,因为 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

【讨论】:

  • 嗯,我想起了一些关于你发帖的事情。感谢您纠正我。
猜你喜欢
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多