c# - Decimal.GetHashCode 取决于尾随零

标签 c# .net

<分区>

Possible Duplicate:
C# Why can equal decimals produce unequal hash values?

我在我的 .NET 3.5 应用程序(x86 或 x64,我都试过了)中遇到了一个问题,其中尾随零的数量不同的小数具有不同的哈希码。例如:

decimal x = 3575.000000000000000000M;
decimal y = 3575.0000000000000000000M;

Console.WriteLine(x.GetHashCode());
Console.WriteLine(y.GetHashCode());
Console.WriteLine(x == y);
Console.WriteLine(x.GetHashCode() == y.GetHashCode());

在我的机器上输出以下内容:

1085009409
1085009408
True
False

我认为哈希码的差异归因于不同比例因子导致的两个数字的不同内部表示。

虽然我可以通过删除尾随零来解决这个问题,但我始终假设如果 x == y,GetHashCode 应该为 x 和 y 返回相同的值。这个假设是错误的,还是 Decimal.GetHashCode 有问题?

编辑:要明确我使用的是 Visual Studio 2008 SP1、.NET 3.5 的版本。

最佳答案

这是 Decimal.GetHashCode 的问题,适用于 .NET Framework 3.5 及更低版本。当两个值被认为相等时,根据指南,它们必须返回相同的哈希码;在这种情况下,decimal 显然不是。您应该始终期望两个相同的对象具有相同的哈希码。

Per MSDN :

If two objects compare as equal, the GetHashCode method for each object must return the same value.

复制

我已经针对不同版本的 .NET Framework 尝试了您的确切代码,结果是:

╔══════════════════╤══════════════════╗
║Framework version │ Hashcode equal ? ║
╟──────────────────┼──────────────────╢
║      2.0         │  No.             ║
║      3.0         │  No.             ║
║      3.5         │  No.             ║
║      4.0         │  Yes.            ║
║      4.5         │  Yes.            ║
╚══════════════════╧══════════════════╝

换句话说,您似乎偶然发现了 .NET Framework 中的错误,该错误已由 .NET Framework 4 修复。

以上结果是使用Visual Studio 2012 RC实现的,使用属性页切换框架。

微软 acknowledges the bug here .

关于c# - Decimal.GetHashCode 取决于尾随零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297815/

相关文章:

c# - "System.Math.Cos"可以返回一个(float)吗?

c# - 来自 ASP.NET MVC 应用程序 : database, 队列文件夹的 SMTP 邮件还是异步?

c# - 从 C# 代码隐藏 (.NET) 调用 JavaScript 函数时出现问题

c# - Breeze + NHibernate 多对一关系,避免必须指定关系键

c# - 从 C# 代码执行 NuGet 命令

c# - Linq: GroupBy 其 child.value 属性值

.net - 如何在 XNA 引擎中嵌入 Ruby?

c# - Linq to XML 查询返回字符串列表

c# - 为什么 NetworkChange.NetworkAddressChanged 事件触发两次?

c# - 在 C#/WinForms 中制作多语言应用程序的最佳实践?