为什么`null` Nullable <t>有哈希码?

时间:2018-02-12 13:58:49

标签: c# nullable

有点奇怪的问题......

但是,任何人都可以给我一个理由来解释为什么这会是预期的行为吗?

这对我来说似乎很奇怪......

//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

3 个答案:

答案 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,则为零。