有点奇怪的问题...
但是谁能给我一个理由来解释为什么这是预期的行为?
这对我来说似乎很奇怪......
//Makes perfect sense
object o = null;
o.GetHashCode().Dump();
NullReferenceException:未将对象引用设置为实例的实例 对象。
//Seems very odd
int? i = null;
i.GetHashCode().Dump();
0
这显然意味着:
int? zero = 0;
int? argh = null;
zero.GetHashCode() == argh.GetHashCode(); //true
重点是
int? i = null;
不会创建变量
i
(即 null
),而是(通过执行隐式转换)创建一个没有值的 Nullable<int>
实例。null
(并且由于 Nullable<T>
是结构/值类型,它实际上不能是 null
),因此必须返回哈希码。
这也记录在这里:
如果 HasValue 属性为 true,则由 Value 属性返回对象的哈希码;如果 HasValue 属性为 false,则返回零。
int?
实际上只是 Nullable<int>
的简写,它是一个包装 int
类型以允许其为 null 的结构体。 Nullable 可以与任何值类型一起使用。
因为 Nullable 实际上是一个结构体(它不能为 null),所以它必须返回 something 作为哈希码,并且通常它会返回值的哈希码(大概是为了对值尽可能透明)之内)。当值为 null 时,在源代码中硬编码为默认返回 0:
public override int GetHashCode() {
return hasValue ? value.GetHashCode() : 0;
}
Nullable<T>.GetHashCode()
的记录行为,如文档所述:
Value 属性返回的对象的哈希码,如果 HasValue 属性为 true,如果 HasValue 属性为 false,则为零。