.NET 5 中意外的 String.Compare() 结果

问题描述

我试图解决的问题是为一个公共库添加多个目标框架(NET45 之前和 NETSTANDARD2.0 新)。该库包含许多用于对字符串进行排序的实用程序类。我想找到保持 .NET 5.0 应用程序具有与以前相同的排序结果的最佳方法。我想知道最好的方法是什么。

这是一个例子。

在 .NET Frameworks 4 和 .NET 5 中比较 .- 将返回不同的顺序。这是一个重大变化。

两个运行时的结果是:

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));             
    }
}

解决方法

自然语言系统 确定 .NET 是对 Windows 应用程序使用国家语言支持 (NLS) 还是 Unicode 国际组件 (ICU) 全球化 API。 .NET 5.0 及更高版本在 Windows 2019 年 5 月 10 日更新及更高版本上默认使用 ICU 全球化 API。

  • 如果省略此设置,.NET 将默认使用 ICU 全球化 API。这相当于将该值设置为 false。
                      Setting name                        Values
runtimeconfig.json    System.Globalization.UseNls         false - Use ICU globalization
                                                          true - Use NLS globalization
Environment variable  DOTNET_SYSTEM_GLOBALIZATION_USENLS  false - Use ICU globalization
                                                          true - Use NLS globalization

Source