【发布时间】:2021-04-20 15:13:16
【问题描述】:
我要解决的问题是为一个公共库添加多个目标框架(之前的 NET45 和新的 NETSTANDARD2.0)。该库包含许多用于对字符串进行排序的实用程序类。我想找到使 .NET 5.0 应用程序具有与以前相同的排序结果的最佳方法。我想找出最好的方法。
这是一个例子。
比较 . 和 - 将在 .NET Frameworks 4 和 .NET 5 中返回不同的顺序。这是一个重大更改。
两个运行时的结果是:
-
.NET Frameworks 4.7:-1,表示
._ - https://dotnetfiddle.net/I0yIr6 -
.NET 5.0: 1 表示
.>_- https://dotnetfiddle.net/6YQCmA
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
// returns -1 in NET47 but returns 1 in NET5_0
Console.WriteLine(string.Compare(".", "_", StringComparison.InvariantCulture));
Console.WriteLine(string.Compare(".", "_", StringComparison.CurrentCulture));
var cultureInfo = new CultureInfo("en-US", false);
Console.WriteLine(string.Compare(".", "_", true, cultureInfo));
}
}
【问题讨论】:
-
文档是here;原因是 unicode 很复杂,而 .NET 5 现在使用 ICU(而不是 NLS)更正确,即使这意味着对某些结果进行更改
-
其他链接:breaking change(和full description)和more
-
真正的问题是什么?您的标题说明了原因,但为什么的答案对任何人都没有帮助。您是否有在两个框架中都运行的代码,而那是真正的问题?
-
如果您的代码不再运行,您可以随时通过在项目中将
System.Globalization.UseNls设置为 true 来切换回旧行为。 -
或者使用
Ordinal,也更快。 实际问题是什么?请记住,即使在 .NET Core 3 中,代码也会在不同平台上产生不同的结果,这实际上是更糟糕。使用 .NET (Core) 5,相同的代码在任何地方都会表现出相同的行为。
标签: c# .net .net-core .net-5 .net-standard-2.0