Error en la cadena de comparación de .NET Framework

Es un requisito para cualquiertipo de comparación para trabajar que el operador de orden subyacente estransitivo yantisimetrico.

En .NET, eso no es cierto para algunas cadenas:

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
}

Ves quex es estrictamente mayor queyyy es estrictamente mayor quex.

Porquex.CompareTo(x) y así en todos dan cero (0), está claro que esto no es una orden. No es sorprendente que obtenga resultados impredecibles cuandoSort matrices o listas que contienen cadenas comox yy. Aunque no he probado esto, estoy seguroSortedDictionary<string, WhatEver> Tendrá problemas para mantenerse ordenado y / o para ubicar elementos si las cadenas comox yy Se utilizan para llaves.

¿Es este error conocido? ¿Qué versiones del marco están afectadas (estoy intentando esto con .NET 4.0)?

EDITAR:

Aquí hay un ejemplo donde el signo es negativo de cualquier manera:

x = "\u4E00\u30A0";         // equiv: "一゠"
y = "\u4E00\u002D\u0041";   // equiv: "一-A"

Respuestas a la pregunta(2)

Su respuesta a la pregunta