Это требование для любого сортировки сортировки для работы, что основной оператор порядка транзитивный и антисимметричный.
В .NET это неверно для некоторых строк:
static void CompareBug()
{
  string x = "\u002D\u30A2";  // or just "-ア" if charset allows
  string y = "\u3042";        // or just "あ" if charset allows
  Console.WriteLine(x.CompareTo(y));  // positive one
  Console.WriteLine(y.CompareTo(x));  // positive one
  Console.WriteLine(StringComparer.InvariantCulture.Compare(x, y));  // positive one
  Console.WriteLine(StringComparer.InvariantCulture.Compare(y, x));  // positive one
  var ja = StringComparer.Create(new CultureInfo("ja-JP", false), false);
  Console.WriteLine(ja.Compare(x, y));  // positive one
  Console.WriteLine(ja.Compare(y, x));  // positive one
}
Вы видите, что x строго больше y, а y строго больше x.
Потому что x.CompareTo(x) и т.д. все дают нуль (0), ясно, что это не порядок. Неудивительно, что я получаю непредсказуемые результаты, когда я Sort массивы или списки, содержащие строки типа x и y. Хотя я не тестировал это, я уверен, что SortedDictionary<string, WhatEver> будет иметь проблемы, сохраняя себя в отсортированном порядке и/или размещая элементы, если для ключей используются строки типа x и y.
Известна ли эта ошибка? Какие версии фреймворка затронуты (я пытаюсь это сделать с .NET 4.0)?
EDIT:
Здесь пример, где знак отрицателен в любом случае:
x = "\u4E00\u30A0";         // equiv: "一゠"
y = "\u4E00\u002D\u0041";   // equiv: "一-A"
