【发布时间】:2021-12-14 01:37:01
【问题描述】:
我有以下代码行:
String.Equals("strasse", "straße", StringComparison.InvariantCultureIgnoreCase)
在 .net 4.7.2 中,返回 true。
在 .net 5(和 .net 6)中,这将返回 false。
为什么?
我目前正在学习如何在 C# 中比较字符串。网。并且遇到了一个我不完全理解的意外结果。
当使用重载方法String.Equals(string,string,Stringcomparison) 比较字符串:"strasse" 和字符串:"straße" 与以下字符串比较:
Console.WriteLine(String.Equals("strasse", "straße", StringComparison.OrdinalIgnoreCase));
Console.WriteLine(String.Equals("strasse", "straße", StringComparison.CurrentCultureIgnoreCase));
Console.WriteLine(String.Equals("strasse", "straße", StringComparison.InvariantCultureIgnoreCase));
我得到以下结果:
False
False
False
我希望第一行返回 false,但第二行和第三行都返回 true。 我首先虽然可能是我的 CurrentCulture 是问题所在,所以可以肯定的是,CurrentCulture 和 CurrentUICulture 都是:
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.CreateSpecificCulture("de-DE");
我是否错误地理解了字符串比较?还是我在这里遗漏了一些明显的东西?
提前感谢愿意帮助我理解的人
【问题讨论】:
-
即使没有设置当前的文化,我也只是运行
Console.WriteLine(String.Equals("strasse", "straße", StringComparison.InvariantCultureIgnoreCase));并打印了True -
CurrentCulture结果将取决于线程的文化设置 -
@Bugbeeb 不应该
InvariantCultureIgnoreCase比较给我True,不管我的CurrentCulture 会设置什么? -
事实证明,如果我们以框架 5.0 及更高版本为目标,它不会给出我预期的结果。但是,我刚刚使用 .NET 框架 4.7.2 制作了一个新的控制台应用程序,并得到了我期望的确切结果。我查看了 .NET 5 的变化,找不到可以解释差异的东西。有人能指出我正确的方向吗?
标签: c# .net-5 .net-4.7.2