Подтвердить что ты не робот

Инвариантное с учетом регистра сравнение строк возвращает разные результаты на разных машинах

Я обнаружил, что результаты теста отличаются на моей машине и сервере сборки. Мне удалось найти единственную строку, которая отличается. Это сравнение строк. Две строки отличаются в случае первого символа.

Тест ниже проходит на моем локальном компьютере и выходит из строя на машине сборки.

[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 должен возвращать одинаковые результаты везде. Каким образом зависящее от случая культура-инвариантное сравнение строк зависит от машины? Какие параметры следует проверить, чтобы определить проблему?

Обновление: платформа и строка

Строка важна. Эти результаты можно наблюдать для строк с "экзотической" пунктуацией, таких как ПРАВИЛЬНАЯ ОДНОЦВЕТНАЯ МАРКА или ПРАВИЛЬНАЯ ДВОЙНАЯ ЦЕЛЕВОЙ МАРКИ

Кажется, что поведение воспроизводится на машинах 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 (сервер): Microsoft Windows NT 6.2.9200.0
Environment.Is64BitOperatingSystem (сервер): True
Environment.Version (сервер) 4.0.30319.18449

Environment.OSVersion (локальный): Microsoft Windows NT 6.1.7601 Пакет обновления 1
Environment.Is64BitOperatingSystem (локальный): True Environment.Version (локальный): 4.0.30319.18444

Обновление: связанная с форумом форума MSDN

Это может быть известная ошибка в Windows 8, которая исправлена ​​в Windows 8.1.

http://social.msdn.microsoft.com/Forums/vstudio/en-US/4a1ab6b7-6dcc-46bf-8650-e0d9ebbf1735/stringcompare-not-always-casesensitive-on-windows-8?forum=netfxbcl

4b9b3361

Ответ 1

InvariantCulture, к сожалению, по-прежнему лингвистическое сравнение и, как таковой, может варьироваться (и меняется, особенно когда новые символы добавляются в Unicode) между версиями ОС. Версии .Net до 4.0 несли свою собственную полезную нагрузку данных и, следовательно, не менялись, но с тех пор они собирают данные из ОС и потенциально могут меняться. Ordinal - это единственное сравнение, которое не изменится и что вам действительно нужно делать, если вы хотите стабильности.

Тем не менее, вы не должны видеть различия в поведении для кода, который вы поставляете. Различия, которые вы наблюдаете, связаны с ошибкой Windows 8, исправленной в Windows 8.1.