如何修复:在闭包 resharper 警告中访问 foreach 变量?

Posted

技术标签:

【中文标题】如何修复:在闭包 resharper 警告中访问 foreach 变量?【英文标题】:How do I fix: Access to foreach variable in closure resharper warning? 【发布时间】:2012-09-14 20:30:38 【问题描述】:

我收到了这个 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");

请注意,这是按预期工作的,但如何避免此警告? 我将不胜感激所提供的任何帮助。

【问题讨论】:

如果你只使用Expression&lt;&gt;,你为什么要使用.Compile()?为什么不直接使用Func&lt;&gt; 你为什么要传入一个表达式而不是一个布尔值? @ChaosPandion:这对我很有帮助,因为我不需要在我的视图中使用 if。 @KellyEthridge:因为我想做一个 DisplayBooleanFor 而不是 DisplayBoolean。 Access to Modified Closure (2) 的可能重复项 【参考方案1】:

块范围的变量应该解决警告。

@foreach(var item in Model)

    var myItem = item;
    <div>@Html.DisplayBooleanFor(modelItem => myItem.BooleanField)</div>

【讨论】:

谢谢,它修复了警告,知道为什么会这样吗? @Esteban 在 JetBrains wiki here 上有更多内容(根据您的 R# 版本,可能会直接从灯泡菜单链接为“为什么 ReSharper 建议这样做?);另见this SO question @Esteban 这是迄今为止我发现的最好的解释:***.com/questions/14907987/…【参考方案2】:

另一种选择是将JetBrains.Annotations.InstantHandleAttribute 属性应用于DisplayBooleanFor 方法。

【讨论】:

以上是关于如何修复:在闭包 resharper 警告中访问 foreach 变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Resharper 将此标记为“访问修改后的闭包”?

访问修改后的闭包:ReSharper

来自 ReSharper 的“从不使用自动属性访问器”警告

可变变量可以从闭包中访问。我怎样才能解决这个问题?

如何升级到 C# 5.0?访问修改后的闭包

在直接调用委托的情况下如何减轻“访问修改的闭包”