2012-09-22 51 views
25

我收到了這個ReSharper警告:在閉包中訪問foreach變量。使用不同版本的編譯器編譯時可能會有不同的行爲。如何解決:在關閉resharper警告中訪問foreach變量?

這是我在做什麼:

@foreach(var item in Model) 
{ 
    // Warning underlines "item". 
    <div>@Html.DisplayBooleanFor(modelItem => item.BooleanField)</div> 
} 

我的擴展如下:

public static MvcHtmlString DisplayBooleanFor<TModel, TValue>(
    this HtmlHelper<TModel> helper, 
    Expression<Func<TModel, TValue>> expression) 
{ 
    bool value; 

    try 
    { 
     var compiled = expression.Compile()(helper.ViewData.Model); 
     value = Convert.ToBoolean(compiled); 
    } 
    catch (Exception) 
    { 
     value = false; 
    } 

    return MvcHtmlString.Create(value ? "Yes" : "No"); 
} 

注意這是按預期工作,但我如何才能避免這樣的警告?
我會感謝您提供的任何幫助。

+2

爲什麼你使用'Expression <>'如果你所做的全部是調用'.Compile()'?爲什麼不直接使用'Func <>'? – hvd

+0

你爲什麼要傳遞一個表達式,而不僅僅是一個布爾? –

+0

@ChaosPandion:這對我很有幫助,因爲我不需要在我的視圖中使用if。 – Esteban

回答

25

塊範圍變量應該解決警告。

@foreach(var item in Model) 
{ 
    var myItem = item; 
    <div>@Html.DisplayBooleanFor(modelItem => myItem.BooleanField)</div> 
} 
+0

謝謝,它修復了警告,爲什麼會發生這種情況? – Esteban

+10

@Esteban JetBrains wiki上有更多的[這裏](這取決於你的R#版本可能直接從燈泡菜單爲'爲什麼ReSharper暗示這一點?另見[這個SO問題](http://stackoverflow.com/questions/235455/access-to-modified-closure?rq=1) – AakashM

+2

@Esteban這是迄今爲止我找到的最好的解釋:http:// stackoverflow。 COM /問題/ 14907987 /訪問到的foreach可變的閉合 – ForceMagic

2

另一種選擇是將JetBrains.Annotations.InstantHandleAttribute屬性應用於DisplayBooleanFor方法。