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);
答案 0 :(得分:3)
您可以为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总是为真