ReSharper 5.x,HashSet包含()和“可能'null'赋值”

时间:2010-12-08 00:08:44

标签: c# null resharper contains hashset

此代码输出True

using System;
using System.Collections.Generic;

public class Default
{
    public static void Main(string[] args)
    {
        HashSet<string> foo = new HashSet<string>();
        foo.Add(null);
        Console.WriteLine(foo.Contains(null));
    }
}

我的Contains()调用中的null下面有一个蓝色的波浪形,并带有以下警告:

  

对实体的可能'null'分配   标有'NotNull'属性

当我暂停ReSharper时,警告消失了。

为什么会出现此警告?鉴于我可以 null添加到HashSet,那么我想要在 HashSet中检查null 是什么呢?

编辑: .NET 3.5,VS2010

2 个答案:

答案 0 :(得分:3)

我想说这是Resharper中的一个错误。构造HashSet<T>类型以处理null值。通过检查反射器中的代码可以看出这一点。特别是InternalGetHashCode方法,它明确检查null并提供默认哈希码0。

这可能会导致问题的一个案例是传递给IEqualityComparer<T>的自定义HashSet<T>个实例,这些实例未考虑null值。我会说这是相当罕见的,因为null检查是.Net中引用类型的标准相等模式的一部分。

注意:要明确,我当然不会鼓励人们将null添加到他们的收藏中。事实上我会鼓励相反的事情。只是指出无论出于何种原因HashSet<T>似乎明确允许这种情况。

答案 1 :(得分:0)

我怀疑此可能是因为HashSet<T>.Contains方法是ICollection<T>.Contains的实现。

ICollection<T>的其他实现可能不允许空值。

无论是否是这种情况,都没有理由无法将ReSharper规则集改进为不将其标记为潜在错误。