使用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
答案 0 :(得分:9)
它正在发生,因为该类实现了IDictionary<TKey, TValue>
;如果您(暂时)删除类签名的接口部分,警告将消失。
由于标准System.Collections.Generic.Dictionary
类中的“键”永远不会是null
(它会抛出ArgumentNullException
),我会说ReSharper做出了错误的假设。
测试行为:
我在一个空的项目中测试了这个类并试了一下。虽然ReSharper使所有代码变灰,但它仍然在运行时执行。
灰色文本表示ReSharper认为逻辑将始终下降到else
块,但使用它时显然不是这样。
修复,使用注释:
要解决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)