Первое, что следует отметить, это то, что конструктор для RegionInfo
находит регион , находя культуру, используемую в этом регионе .Таким образом, он ищет язык в этой стране, а не только в стране.
При чтении этого исходного кода, похоже, что разница в верхнем / нижнем регистре заключается в том, как выполняется поиск, если не указана культурас регионом.
Например, сначала он пытается сделать несколько вещей, но , а затем попытается посмотреть в статический список областей .Но поскольку он использует Dictionary.ContainsKey
, это поиск с учетом регистра.Таким образом, если вы укажете "US"
, он найдет его, но не "us"
.
Позже, он найдет во всех культурах (из CultureInfo.GetCultures(CultureTypes.SpecificCultures)
) регион, который вы указали, но он делает это без учета регистра.
Я не могу подтвердить, так как не могу просмотреть этот код, но я предполагаю, что, поскольку он проходит по списку по порядку, он будетдоберитесь до chr-Cher-US
, прежде чем доберетесь до en-US
.
Почему это не согласовано?
В одном из комментариев говорится, что LinqPad находит Cherokee даже при использовании верхнегодело.Я не знаю, почему это так.Мне удалось воспроизвести это, но я также обнаружил, что в Visual Studio это английский язык при использовании "US"
и Cherokee при использовании "us"
, как вы описали.Но я обнаружил, что если я включаю «Использовать экспериментальные сборки Roslyn» в LinqPad, то он возвращает английский для "US"
и "us"
.Так что, возможно, это как-то связано с точной целевой версией времени выполнения, я не могу сказать наверняка.
Одна вещь, которая влияет на согласованность, - это кеширование : первое, что будет сделано, когдаон не получает полного соответствия по культуре + регион - проверяет кэш уже найденных культур .Это строчные буквы всех ключей в этом кеше, поэтому этот кеш не учитывает регистр.
Вы можете проверить это.Мы знаем, что использование "US"
против "us"
даст другие результаты, но попробуйте это в той же программе:
var nativeNameus = new RegionInfo("us").NativeName;
var nativeNameUS = new RegionInfo("US").NativeName;
Затем поменяйте их местами и запустите снова:
var nativeNameUS = new RegionInfo("US").NativeName;
var nativeNameus = new RegionInfo("us").NativeName;
Оба результата всегда будут одинаковыми, потому что первая культура кэшируется и используется для следующей.
Возможно, что существует код вне вашего кода, который вызывает те же методы и заканчивает кэшированием значения культуры, тем самым изменяярезультат, который вы получаете, когда делаете то же самое.
Заключение
Все, что сказано, документы фактически говорят :
Мы рекомендуем использовать имя-для культуры примера, «EN-US» на английском языке (США) -в доступ к свойству NativeName.
Так что это немного тооСуть: вы просили регион, а не язык.Если вам нужен конкретный язык, попросите этот язык, а не только регион.
Если вы хотите гарантировать английский, то либо:
- Сделайте, как рекомендует Microsoft, и укажите языкс регионом: "en-US" или
- Используйте свойства
EnglishName
или DisplayName
(которые являются английскими, даже если NativeName
Чероки).