此代码输出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
答案 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规则集改进为不将其标记为潜在错误。