Инвариантное с учетом регистра сравнение строк возвращает разные результаты на разных машинах
Я обнаружил, что результаты теста отличаются на моей машине и сервере сборки. Мне удалось найти единственную строку, которая отличается. Это сравнение строк. Две строки отличаются в случае первого символа.
Тест ниже проходит на моем локальном компьютере и выходит из строя на машине сборки.
[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
Ответы
Ответ 1
InvariantCulture, к сожалению, по-прежнему лингвистическое сравнение и, как таковой, может варьироваться (и меняется, особенно когда новые символы добавляются в Unicode) между версиями ОС. Версии .Net до 4.0 несли свою собственную полезную нагрузку данных и, следовательно, не менялись, но с тех пор они собирают данные из ОС и потенциально могут меняться. Ordinal - это единственное сравнение, которое не изменится и что вам действительно нужно делать, если вы хотите стабильности.
Тем не менее, вы не должны видеть различия в поведении для кода, который вы поставляете. Различия, которые вы наблюдаете, связаны с ошибкой Windows 8, исправленной в Windows 8.1.