3

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);
4

2 回答 2

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 提供服务。

您还可以查看泛型参数何时不能为空,以获取有关此的更多信息。

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

于 2014-12-23T17:00:19.010 回答
-4

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

于 2014-12-23T16:48:40.167 回答