执行这段代码后:
int a = 50;
float b = 50.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());
Run Code Online (Sandbox Code Playgroud)
我们得到False,这是预期的,因为我们正在处理不同的对象,因此我们应该得到不同的哈希值。
但是,如果我们执行以下命令:
int a = 0;
float b = 0.0f;
Console.WriteLine(a.GetHashCode() == b.GetHashCode());
Run Code Online (Sandbox Code Playgroud)
我们得到True. 两个对象返回相同的哈希码:0。
为什么会出现这种情况?他们不应该返回不同的哈希值吗?
的GetHashCode作品System.Int32如下:
public override int GetHashCode()
{
return this;
}
Run Code Online (Sandbox Code Playgroud)
当然,有了这个存在0,它就会回归0。
System.Single的(float是别名)GetHashCode是:
public unsafe override int GetHashCode()
{
float num = this;
if (num == 0f)
{
return 0;
}
return *(int*)(&num);
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,0f它会返回0。
使用的程序是ILSpy。
| 归档时间: |
|
| 查看次数: |
1918 次 |
| 最近记录: |