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

时间:2014-12-23 16:44:08

标签: c# .net-4.5 resharper-8.0

ReSharper声称我对serviceProvider的空检查始终为true,这很奇怪。我认为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);

2 个答案:

答案 0 :(得分:3)

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

的文件
  

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

您还可以查看When can a generic parameter never be null以获取更多相关信息。

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

答案 1 :(得分:-4)

由于ProvideValue是一个需要IServiceProvider的函数 Resharper正确地假定如果在调用ProvideValue函数之前检查serviceProvider为null,那么espression总是为真