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 .