有点奇怪的问题......
但是,任何人都可以给我一个理由来解释为什么这会是预期的行为吗?
这对我来说似乎很奇怪......
//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
答案 0 :(得分:47)
这里的重点是
int? i = null;
不创建i
变量null
,但是(通过执行隐式强制转换)创建没有值的Nullable<int>
实例。
这意味着对象/实例不是null
(因为Nullable<T>
是结构/值类型,它实际上不能是null
),因此必须返回哈希码。
这也记录了here:
如果HasValue属性为true,则Value属性返回的对象的哈希码,如果HasValue属性为false,则返回零。
答案 1 :(得分:16)
int?
实际上只是Nullable<int>
的简写,int
是一个包含public override int GetHashCode() {
return hasValue ? value.GetHashCode() : 0;
}
类型的结构,以便允许它为null。 Nullable可以与任何值类型一起使用。
因为Nullable实际上是一个结构(它不能为null),它必须为哈希代码返回某些东西,通常它会返回值的哈希代码(大概是为了成为尽可能透明到其中的值)。当值为null时,硬编码默认返回0:
{{1}}
请参阅here。
答案 2 :(得分:8)
看起来像Nullable<T>.GetHashCode()
,as documentation says的记录行为:
Value属性返回的对象的哈希码,如果是 HasValue属性为true,如果HasValue属性为false,则为零。