ReSharper 声称我的表达总是正确的?它是正确的还是一个错误?

Posted

技术标签:

【中文标题】ReSharper 声称我的表达总是正确的?它是正确的还是一个错误?【英文标题】:ReSharper claims that my expression is always true? Is it correct or is it a bug? 【发布时间】:2015-02-21 20:11:05 【问题描述】:

ReSharper 声称我对 serviceProvider 的空值检查总是正确的,这很奇怪。我认为 serviceProvider 很可能是空的。我在这里错了吗,还是这是一个 ReSharper 错误?

public override object ProvideValue(IServiceProvider serviceProvider)

    switch (Mode)
    
        case BindingMode.TwoWay:
            throw new InvalidOperationException("Invalid binding mode.");

        case BindingMode.OneWayToSource:
            throw new InvalidOperationException("Invalid binding mode.");

        case BindingMode.OneWay:
        case BindingMode.OneTime:
            break;

        case BindingMode.Default:
            if (serviceProvider != null) // Expression is always true?? O.o
            
                // Returns something possibly...
            

            throw new InvalidOperationException("Invalid binding mode.");

        default:
            throw new InvalidOperationException("Unexpected binding mode.");
    

    return base.ProvideValue(serviceProvider);

更新:

我创建了一个控制台应用程序,以下代码也给出了警告(来自 ReSharper)Possible null assignment to entity marked with 'NotNull' attribute.

var binding = new CustomBinding();
binding.ProvideValue(null);

【问题讨论】:

听起来像一个 R# 错误,除非你没有显示完整的代码? 好吧,你能给它一个空值并确认它是错误的吗? @Jonesy:如果我也尝试传入 null,ReSharper 会警告我。 【参考方案1】:

由于ProvideValue是一个需要IServiceProvider的函数 Resharper 正确假设如果 serviceProvider 为 null,则在调用 ProvideValue 函数之前检查,因此 espression 始终为 true

【讨论】:

Resharper 没有做这样的假设,有人可以用ProvideValue(null);调用该方法 我在旧版本中经常看到它,所以我会在 9.0 中坚持我的答案,尽管该特定代码的评估并不总是如此。杀了我不好的判断:)【参考方案2】:

取自http://msdn.microsoft.com/en-us/library/system.windows.markup.typeextension.providevalue%28v=vs.110%29.aspx的文档

您可以为 serviceProvider 传递 null,但前提是此 TypeExtension 在构造函数中使用初始真实类型建立实例 而不是 typeName。否则,此标记扩展 实现依赖于基于传递的 serviceProvider 的服务。 它不能为空。 serviceProvider 应提供一个 IXamlTypeResolver 的服务。

您也可以查看When can a generic parameter never be null 了解更多信息。

显然,如果我是正确的,此方法的参数有一个协定 [NotNull],因为某些实现会在 null 参数上抛出错误。

【讨论】:

以上是关于ReSharper 声称我的表达总是正确的?它是正确的还是一个错误?的主要内容,如果未能解决你的问题,请参考以下文章

ReSharper 为 lambda 表达式中的变量名提供“@”前缀

如何防止 Resharper 大量缩进 lambda?

解决 C# 中的 Resharper 错误

Resharper 是不是正确?

Resharper 是不是正确?

Resharper 所说的“对象分配(明显)”是啥意思?