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 声称我的表达总是正确的?它是正确的还是一个错误?的主要内容,如果未能解决你的问题,请参考以下文章