ReSharper:空检查始终是错误警告

时间:2014-12-20 14:06:48

标签: c# generics resharper

使用ReSharper 8.2我收到一个警告("表达式始终为假")进行空值检查

public bool TryGetValue(TKey key, out TValue value)
{
  if (key == null)
来自NHibernate NullableDictionary

。为什么是这样?当我尝试

class Test<T> where T : class

然后我没有按预期得到对T变量进行空检查的警告。

修改:为了方便起见,链接源的类签名是:

public class NullableDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TKey : class

1 个答案:

答案 0 :(得分:9)

它正在发生,因为该类实现了IDictionary<TKey, TValue>;如果您(暂时)删除类签名的接口部分,警告将消失。

由于标准System.Collections.Generic.Dictionary类中的“键”永远不会是null(它会抛出ArgumentNullException),我会说ReSharper做出了错误的假设。


测试行为:

我在一个空的项目中测试了这个类并试了一下。虽然ReSharper使所有代码变灰,但它仍然在运行时执行。

灰色文本表示ReSharper认为逻辑将始终下降到else块,但使用它时显然不是这样。

enter image description here


修复,使用注释:

要解决ReSharper的问题,默认情况下假设密钥不能为null,您可以使用JetBrains注释。

添加对JetBrains Annotations程序集的引用。对我来说,这是位置:

  

C:\ Program Files(x86)\ JetBrains \ ReSharper \ v8.2 \ Bin \ JetBrains.Annotations.dll

然后将using指令添加到类所在文件的顶部:

using JetBrains.Annotations;

现在使用CanBeNull属性标记该参数,您将看到ReSharper不再灰显文本:

public bool TryGetValue([CanBeNull] TKey key, out TValue value)

enter image description here