c# - 委托(delegate)中变量的范围

标签 c# functional-programming delegates lambda scope

我发现以下内容很奇怪。再说一次,我主要使用动态语言中的闭包,这不应该是同一个“错误”。以下内容使编译器不高兴:

VoidFunction t = delegate { int i = 0; };

int i = 1;

它说:

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

所以这基本上意味着在委托(delegate)中声明的变量将具有在其中声明的函数的范围。这与我所期望的完全不同。我什至没有尝试调用该函数。至少 Common Lisp 有一个特性,你说变量应该有一个动态名称,如果你真的希望它是本地的。这在创建不会泄漏的宏时尤为重要,但类似的东西在这里也会有所帮助。

所以我想知道其他人是如何解决这个问题的?

为了澄清,我正在寻找一种解决方案,其中我在委托(delegate)中声明的变量不会干扰在委托(delegate)之后声明的变量。而且我仍然希望能够捕获在委托(delegate)之前声明的变量。

最佳答案

必须以这种方式允许匿名方法(和 lambda)使用局部变量和包含方法范围内的参数。

解决方法是为变量使用不同的名称,或者创建一个普通方法。

关于c# - 委托(delegate)中变量的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/404899/

相关文章:

c# - 地形树实例无法正确设置

lambda - 如何在Kotlin中编写正确的HTML生成器

具有默认方法与特征的 C# 接口(interface)

c# - 是否有可能动态地创建委托(delegate)给方法 currying 一些参数(并且在没有表达式的编译和 DynamicInvoke 的情况下做到这一点)?

ios - 注销委托(delegate)不起作用

c# - 为什么编译器不能从用法中推断出这个类型参数

c# - 从 silverlight 应用程序访问 SQL Server 数据库

c# - 托管*稳定* WCF MSMQ Windows 服务的正确方法

c# - 如何使用log4net创建log.txt?

perl - 如何使用鼠标委托(delegate)数组的第一个元素?