2012-09-22 14 views
25

Bu ReSharper uyarısını alıyorum: Kapatma değişkenine erişim kapatılıyor. Derleyici'un farklı sürümleriyle derlendiğinde farklı davranışlar olabilir. beklendiği gibi bu çalışmaktadırNasıl giderilir: Kapatma yeniden paylaşım uyarısında foreach değişkenine erişim?

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"); 
} 

Not ama nasıl bu uyarıyı önleyebilirsiniz şu şekildedir:

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

Benim uzantısıdır:

Bu benim yaptığım nedir?
Sağlanan herhangi bir yardım için teşekkür ederiz.

+2

Neden 'İfade kullandığınız <>' onunla ne hepsini çağrı '.Compile()' ne olur? Neden Func <> 'yi kullanmıyorsunuz? – hvd

+0

Neden sadece bir bool yerine bir İfadede geçiyorsunuz? –

+0

@ChaosPandion: Benim görüşüme göre kullanmam gerekmediği için benim için faydalıdır. – Esteban

cevap

25

bir blok uyarı çözmelidir değişkeni kapsamlı.

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

teşekkürler, uyarıyı sabit bir fikrin neden bu olur ? – Esteban

+10

R # sürümüne bağlı olarak doğrudan bağlantılı olabilir JetBrains wiki [burada] (http://confluence.jetbrains.net/display/ReSharper/Access+to+modified+closure) (üzerine daha var @Esteban 'Neden ReSharper bunu önerdi?' http: // stackoverflow bakınız de [bu SO soru] (http://stackoverflow.com/questions/235455/access-to-modified-closure?rq=1) İşte @Esteban – AakashM

+2

Ben bugüne kadar bulunmuş en iyi açıklama bu. com/sorular/14907987/erişim-to-foreach-değişken-in-kapanması – ForceMagic

2

Diğer bir seçenek DisplayBooleanFor yöntemine JetBrains.Annotations.InstantHandleAttribute niteliğini uygulamaktır.

İlgili konular