最初に注意すべきことは、のコンストラクターはRegionInfo
、その地域で使用されているカルチャを見つけることによって地域を見つけることです。つまり、国だけでなく、その国の言語を探しているのです。
そのソース コードを読むと、大文字と小文字の違いは、リージョンでカルチャが指定されていない場合にルックアップがどのように行われるかが原因のようです。
たとえば、最初にいくつかのことを試みますが、その後、地域の静的リストを調べようとします。ただし、 を使用しているためDictionary.ContainsKey
、大文字と小文字を区別して検索します。したがって、 を指定"US"
すると検索されますが、 は検索されません"us"
。
後で、指定した地域のすべてのカルチャ(からCultureInfo.GetCultures(CultureTypes.SpecificCultures)
) を検索しますが、大文字と小文字を区別しない方法で検索します。
そのコードをステップ実行できないので確認できませんが、私の推測では、リストを順番に調べているため、 に到達するchr-Cher-US
前に に到達しen-US
ます。
なぜ一貫していないのですか?
コメントの 1 つは、LinqPad は大文字を使用している場合でもチェロキーを検出すると述べています。これがなぜなのかわかりません。私はそれを複製することができましたが、Visual Studioでは、あなたが説明したよう"US"
に、を使用するときは英語で、使用するときはチェロキーであることもわかりました"us"
。しかし、LinqPad で「実験的な Roslyn アセンブリを使用する」をオンにすると、 と の両方"US"
で英語が返されることがわかりまし"us"
た。そのため、対象となる正確なランタイム バージョンと関係があるのかもしれませんが、確かなことは言えません。
一貫性に影響を与えることの 1 つはキャッシングです。カルチャ + リージョンで完全に一致しない場合に最初に行うことは、既に見つかったカルチャのキャッシュをチェックすることです。そのキャッシュ内のすべてのキーを小文字にするため、このキャッシュでは大文字と小文字が区別されません。
これをテストできます。"US"
vs.を使用すると結果が異なることはわかってい"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;
最初のカルチャがキャッシュされ、次のカルチャに使用されるため、両方の結果は常に等しくなります。
同じメソッドを呼び出して最終的にカルチャ値をキャッシュするコードがコードの外部にある可能性があり、それによって、同じことを行ったときに得られる結果が変化します。
結論
そうは言っても、ドキュメントは実際には次のように言っています:
NativeName プロパティにアクセスするには、カルチャ名 (英語 (米国) の場合は "en-US" など) を使用することをお勧めします。
したがって、それは少し議論の余地があります。言語ではなく、地域を要求したのです。特定の言語が必要な場合は、地域だけでなく、その言語を尋ねてください。
英語を保証したい場合は、次のいずれかを行います。
- Microsoft の推奨に従って、地域で言語を指定します: "en-US"、または
EnglishName
またはプロパティを使用します (がチェロキーDisplayName
であっても英語です)。NativeName