使用 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
最佳答案
它的发生是因为该类实现了 IDictionary<TKey, TValue>
;如果您(暂时)删除类签名的接口(interface)部分,警告就会消失。
自标准中的“关键”System.Collections.Generic.Dictionary
类永远不能是 null
(它抛出一个 ArgumentNullException
),我会说 ReSharper 做出了错误的假设。
测试行为:
我在一个原本为空的项目中测试了这个类并进行了尝试。尽管 ReSharper 将所有代码灰显,但它肯定仍会在运行时执行。
灰色文本表示 ReSharper 相信逻辑将始终下降到 else
block ,但当您使用它时显然不是这种情况。
修复,使用注解:
要绕过 ReSharper 的问题,默认情况下假设 key 不能是 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)
关于c# - ReSharper:空检查始终是错误警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27580970/