我发现我的计算机和构建服务器上的测试结果不同。我设法找到了不同的单行。这是一个字符串比较。第一个字符的两个字符串不同。
下面的测试在我的本地计算机上传递,并在构建计算机上失败。
[TestClass]
public class Tests
{
[TestMethod]
public void Strings()
{
Assert.IsFalse(0 == string.Compare("Term’s", "term’s", false, CultureInfo.InvariantCulture));
}
}
我还尝试将其更改为string.Equals
:
string.Equals("Term’s", "term’s", StringComparison.InvariantCulture);
string.Equals
在构建服务器上返回true,并在本地计算机上返回false。
顺序比较在两台机器上给出相同的结果:
string.Compare("Term’s", "term’s", StringComparison.Ordinal))
据我了解,InvariantCulture应该在各地返回相同的结果。区分大小写的文化不变字符串比较如何依赖于机器?我应该检查哪些设置来识别问题?
字符串很重要。对于带有异国情调"的字符串,可以观察到这些结果。标点符号如RIGHT SINGLE QUOTATION MARK或RIGHT DOUBLE QUOTATION MARK
似乎该行为在Windows 8计算机上重现。如果您输入以下内容,甚至可以在https://dotnetfiddle.net/上看到它:
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
Console.WriteLine(0 == string.Compare("Terms", "terms", false, CultureInfo.InvariantCulture));
Console.WriteLine(0 == string.Compare("Term’s", "term’s", false, CultureInfo.InvariantCulture));
Console.WriteLine(0 == string.Compare("Term“s", "term“s", false, CultureInfo.InvariantCulture));
Console.WriteLine(0 == string.Compare("Term”s", "term”s", false, CultureInfo.InvariantCulture));
//outputs
//False
//True
//True
//True
}
}
Environment.OSVersion
(服务器' s):Microsoft Windows NT 6.2.9200.0
Environment.Is64BitOperatingSystem
(服务器' s):正确
Environment.Version
(服务器' s)4.0.30319.18449
Environment.OSVersion
(本地):Microsoft Windows NT 6.1.7601 Service Pack 1
Environment.Is64BitOperatingSystem
(当地):真实
Environment.Version
(当地):4.0.30319.18444
它可能是Windows 8中的已知错误,已在Windows 8.1中修复。
答案 0 :(得分:6)
遗憾的是,InvariantCulture仍然是一种语言比较,因此它可以在操作系统版本之间变化(并且确实有所不同,特别是在新的字符添加到Unicode时)。 4.0之前的.Net版本带有他们自己的数据有效载荷,因此不会改变,但从那时起他们从操作系统中获取数据并且可能会有所不同。 Ordinal是唯一不会改变的比较,如果你想要稳定,你真正需要做的事情。
也就是说,您不应该看到您提供的代码的行为差异。您观察到的差异是由Windows 8中已修复的Windows 8中的错误引起的。