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

标签 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

最佳答案

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

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


测试行为:

我在一个原本为空的项目中测试了这个类并进行了尝试。尽管 ReSharper 将所有代码灰显,但它肯定仍会在运行时执行。

灰色文本表示 ReSharper 相信逻辑将始终下降到 else block ,但当您使用它时显然不是这种情况。

enter image description here


修复,使用注解:

要绕过 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)

enter image description here

关于c# - ReSharper:空检查始终是错误警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27580970/

相关文章:

c# - 防止使用抽象类作为属性类型

dictionary - 检查 map 是否是另一张 map 的子集

c# - 移动/更新命名空间声明时如何阻止 ReSharper 删除未使用的 Using 语句?

c# - F# 声明的命名空间在 c# 项目中不可用或通过对象浏览器可见

c# - OpenCL 和 GPU 编程路线图

c# - 提取定界符之间的文本行并将它们添加到 List<string>

c# - 如何创建角色放入数据库?

java - 类型删除和集合

c# - 泛型的二元比较运算符

c# - Resharper 查找模式并替换 - 如何插入字符串