【发布时间】:2019-06-12 02:20:59
【问题描述】:
StringComparer.InvariantCultureIgnoreCase Equals 对于 "" 与 "\0" 返回 true,但 GetHashCode 对于两个字符串返回不同的值。这是一个错误吗?
var sc = StringComparer.InvariantCultureIgnoreCase;
string s1 = "";
string s2 = "\0";
Console.WriteLine( sc.Equals(s1, s2) );
Console.WriteLine( sc.GetHashCode(s1) );
Console.WriteLine( sc.GetHashCode(s2) );
返回
True
0
-1644535362
我认为 GetHashCode 应该为“相等”字符串返回相同的值,所以这是一个错误吗?
【问题讨论】:
-
.net 的哪个版本?
-
罪魁祸首似乎是零长度字符串的零散列,而不是
\0本身的添加。当两个字符串都具有非零长度(例如"a"和"a\0")时,比较器似乎返回相等的哈希值。 -
MS 将问题关闭为不会修复。
-
对于 .NET Framework,他们表示由于向后兼容性问题,他们不会修复它。对于 .NET Core,它已被标记为一个错误,希望有一个修复......或者至少解释了这种行为的原因。 (github.com/dotnet/corefx/issues/34662) 有一段时间了,但以防万一你想知道。