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

问题描述 投票:0回答:3

有点奇怪的问题...

但是谁能给我一个理由来解释为什么这是预期的行为?

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

//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
c# nullable
3个回答
49
投票

重点是

int? i = null;

不会创建变量

i
(即
null
),而是(通过执行隐式转换)创建一个没有值的
Nullable<int>
实例。
这意味着对象/实例不是
null
(并且由于
Nullable<T>
是结构/值类型,它实际上不能是
null
),因此必须返回哈希码。

这也记录在这里

如果 HasValue 属性为 true,则由 Value 属性返回对象的哈希码;如果 HasValue 属性为 false,则返回零。


16
投票

int?
实际上只是
Nullable<int>
的简写,它是一个包装
int
类型以允许其为 null 的结构体。 Nullable 可以与任何值类型一起使用。

因为 Nullable 实际上是一个结构体(它不能为 null),所以它必须返回 something 作为哈希码,并且通常它会返回值的哈希码(大概是为了对值尽可能透明)之内)。当值为 null 时,在源代码中硬编码为默认返回 0:

public override int GetHashCode() { return hasValue ? value.GetHashCode() : 0; }
    

8
投票
它看起来像

Nullable<T>.GetHashCode()

 的记录行为,
如文档所述

Value 属性返回的对象的哈希码,如果 HasValue 属性为 true,如果 HasValue 属性为 false,则为零。

© www.soinside.com 2019 - 2024. All rights reserved.