鉴于像System.Collections.Generic.HashSet<>accept 这样的集合null成为集合成员,可以询问哈希代码null应该是什么.它看起来像框架使用0:
// nullable struct type
int? i = null;
i.GetHashCode(); // gives 0
EqualityComparer<int?>.Default.GetHashCode(i); // gives 0
// class type
CultureInfo c = null;
EqualityComparer<CultureInfo>.Default.GetHashCode(c); // gives 0
Run Code Online (Sandbox Code Playgroud)
对于可以为空的枚举,这可能会(有点)出现问题.如果我们定义
enum Season
{
Spring,
Summer,
Autumn,
Winter,
}
Run Code Online (Sandbox Code Playgroud)
然后Nullable<Season>(也称为Season?)可以只取五个值,但其中两个,即null和Season.Spring,具有相同的哈希码.
写这样一个"更好"的平等比较器是很诱人的:
class NewNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
public override bool Equals(T? x, T? y)
{
return Default.Equals(x, y);
}
public override int …Run Code Online (Sandbox Code Playgroud)