簡體   English   中英

C#匿名方法變量范圍問題與IEnumerable <T>

[英]C# Anonymous method variable scope problem with IEnumerable<T>

我正在嘗試遍歷所有組件,並且對於那些實現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);
}

請問應該如何解決?

只是不要關閉循環變量 - 復制它:

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變量的新“實例” - 因此每個委托將捕獲該不同的實例。 之前,每個代表都捕獲相同的變量。

(這在某種程度上是一個重復的問題,但這是一個相對難以搜索的問題,所以我很樂意多次回答。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM