IEnumerable<T> 的 C# 匿名方法变量范围问题

标签 c# generics scope anonymous-methods

我正在尝试遍历所有组件,对于那些实现了 ISupportsOpen 的组件,我允许打开一个项目。 问题是当调用匿名方法时,组件变量总是相同的元素(来自 IEnumerable 的外部范围)

foreach (ISupportsOpen component in something.Site.Container.Components.OfType<ISupportsOpen>())
{
    MyClass m = new MyClass();  
    m.Called += new EventHandler(delegate(object sender, EventArgs e)
    {                           
        if (component.CanOpenProject(..)) component.OpenProject(..);
    });

    itemsList.Add(m);
}

请问应该怎么解决?

最佳答案

只是不要close over the loop variable - 复制它:

foreach (ISupportsOpen component in 
         something.Site.Container.Components.OfType<ISupportsOpen>())
{
    ISupportsOpen copy = component;
    MyClass m = new MyClass();  
    m.Called += new EventHandler(delegate(object sender, EventArgs e)
    {                           
        if (copy.CanOpenProject(..)) copy.OpenProject(..);
    });

    itemsList.Add(m);
}

通过这种方式,您可以为循环的每次迭代获得 copy 变量的新“实例” - 因此每个委托(delegate)将捕获该不同的实例。以前,每个委托(delegate)都捕获相同的变量。

(这在某种程度上是一个重复的问题,但它是一种相对难以搜索的问题,所以我很乐意多次回答。)

关于IEnumerable<T> 的 C# 匿名方法变量范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2628397/

相关文章:

c# - 使用普通参数和泛型参数重载构造函数

python - 是否记录了通过实例访问类变量?

java - 内部类中私有(private)变量的范围

c# - 从 TTF 字体流创建 GlyphTypeface 对象

delphi - 将具有通用参数的类传递给Delphi中的另一个类

c# - 堆与堆栈分配影响 (.NET)

java - Kotlin:扩展动态给定的父类(super class)型

ruby-on-rails - 如何在 Rails Admin 中显示无作用域模型?

c# - 如何在 C# 中清除 Cursor.Clip 并允许光标再次自由移动?

c# - 如何返回 IQueryable<T>