Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda变量范围_C#_Lambda_Scoping - Fatal编程技术网

C# Lambda变量范围

C# Lambda变量范围,c#,lambda,scoping,C#,Lambda,Scoping,例如: myObject.Stub(s => s.MyMethod(null)).IgnoreArguments().Return("bleh"); var s = "s"; 一个变量“s”在lambda中定义,另一个变量“s”在同一方法中定义为局部变量。当我将鼠标悬停在第一个“s”上时,VisualStudio告诉我“下面定义了一个冲突变量”。为什么这些相互冲突;lambda中的“s”在其封闭括号外是不可用的?它们相互冲突,因为C的规则是,同一简单名称的任何两个用法都不能用于表示直接

例如:

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

var s = "s";

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

它们相互冲突,因为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 无法在此作用域中声明名为“s”的局部变量,因为它 将赋予“s”不同的含义,它已在 “child”范围表示其他内容 C#不允许您在同一块中使用相同的简单名称,因为这样做会使代码容易出错、难以编辑、难以阅读、难以重构和难以调试。最好是不允许这种糟糕的编程实践,而不是允许它,因为您假设“s”在整个程序块中都是相同的意思,从而冒着导致错误的风险

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

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


看:嗯,我记得你的帖子。谢谢你纠正我。