Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 区域性不变区分大小写的字符串比较在不同的计算机上返回不同的结果_C#_.net_String Comparison_Cultureinfo - Fatal编程技术网

C# 区域性不变区分大小写的字符串比较在不同的计算机上返回不同的结果

C# 区域性不变区分大小写的字符串比较在不同的计算机上返回不同的结果,c#,.net,string-comparison,cultureinfo,C#,.net,String Comparison,Cultureinfo,我发现在我的机器和构建服务器上的测试结果是不同的。我设法找到了不同的一行。这是一个字符串比较。第一个字符的大小写两个字符串不同 下面的测试在我的本地计算机上通过,但在构建计算机上失败 [TestClass] public class Tests { [TestMethod] public void Strings() { Assert.IsFalse(0 == string.Compare("Term’s", "term’s", false, Cultu

我发现在我的机器和构建服务器上的测试结果是不同的。我设法找到了不同的一行。这是一个字符串比较。第一个字符的大小写两个字符串不同

下面的测试在我的本地计算机上通过,但在构建计算机上失败

[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))
据我所知,不变量文化应该在任何地方都返回相同的结果。区分大小写的区域性不变字符串比较如何依赖于计算机?我应该检查哪些设置以确定问题

更新:平台和字符串 绳子很重要。对于带有“奇异”标点符号(如或)的字符串,可以观察到这些结果

这种行为似乎在Windows8机器上重现。即使键入以下内容,也可以在上看到它:

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
(服务器):Microsoft Windows NT 6.2.9200.0
Environment.is64位操作系统(服务器):True
环境。版本
(服务器)4.0.30319.18449

Environment.OSVersion
(本地):Microsoft Windows NT 6.1.7601 Service Pack 1
Environment.is64位操作系统
(本地):True
环境。版本
(本地):4.0.30319.18444

更新:相关MSDN论坛链接 这可能是Windows 8中的一个已知错误,在Windows 8.1中已修复


不幸的是,不变量文化仍然是一种语言比较,因此在不同版本的操作系统之间可能会有所不同(而且确实会有所不同,尤其是在Unicode中添加新字符时)。4.0之前的.Net版本拥有自己的数据有效负载,因此不会发生变化,但从那时起,它们从操作系统获取数据,并且可能会发生变化。序数是唯一不会改变的比较,如果你想要稳定,你真的需要这样做


也就是说,您不应该看到所提供代码的行为差异。您观察到的差异是由于Windows 8.1中修复的Windows 8错误造成的。

您的电脑和构建服务器运行在什么平台(硬件、操作系统、CLI)上<代码>不变量文化
应该是区分大小写的,所以听起来像是一个平台错误。我不认为你的构建机器有一些奇怪的程序处理,比如一个C#预处理器会弄乱东西,或者某种混淆会弄乱东西,或者某种面向方面的进程注入(我想到了PostSharp)这会弄糟吗?@adriano repetti我现在仔细检查了一下,我复制了测试,代码没有任何更改。当我登记时,测试失败了。至于编码,我不确定它是否在Local->Source Control->Build server中的某个地方被更改,但是(int)str[I]为我的本地机器和服务器返回相同的数字。所以至少它编译成了相同的东西。@CodeCaster我已经添加了
Environment.OSVersion
Environment.Version
的输出。不幸的是,我没有其他访问服务器的权限来检查代码并观察测试结果。我要开罚单去买硬件。关于硬件,我到底应该问些什么?@AdrianoRepetti,hvd这可能是一个已知的Windows 8错误,如果我理解正确的话,它在Windows 8.1中已经修复。你的意思是,即使我将字符串作为英文单词而不是标识符进行比较,我也应该使用顺序比较吗?呃。。。不同操作系统版本之间存在差异的
不变量文化
有什么意义?引用自:“与区域性敏感数据不同,区域性敏感数据可能会因用户自定义或.NET Framework或操作系统的更新而更改,不变的区域性数据随着时间的推移和安装的区域性而保持稳定,用户无法自定义。”@hvd其他区域设置数据也是如此(影响格式设置的事情)。不幸的是,排序(sorting)并非如此。不变式(invariant)就到此为止:(请详细解释!在这种情况下,只有“非ASCII”字符是“右单引号”,而且它已经存在很长时间了。我理解安全含义(如MSDN中所述),但在正常环境中(在没有黑客试图破坏我们的代码的情况下)这是如何应用的?它不可能如此被破坏(如果有bug,我假设它们已经被修复或记录),否则不变文化的全部意义是绝对没有意义的。