続いて、CurrentCultureIgnoreCaseInvariantCultureIgnoreCaseでも違いが現れる例を見てみます。

CurrentCultureIgnoreCaseとInvariantCultureIgnoreCaseで異なる結果となる例
Imports System
Imports System.Globalization
Imports System.Threading

Class Sample
  Shared Sub Main()
    Console.WriteLine(Thread.CurrentThread.CurrentCulture)

    Console.WriteLine("Compare CurrentCulture             : {0}", String.Compare("i", "I", StringComparison.CurrentCulture))
    Console.WriteLine("Compare CurrentCultureIgnoreCase   : {0}", String.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase))
    Console.WriteLine("Compare InvariantCulture           : {0}", String.Compare("i", "I", StringComparison.InvariantCulture))
    Console.WriteLine("Compare InvariantCultureIgnoreCase : {0}", String.Compare("i", "I", StringComparison.InvariantCultureIgnoreCase))

    Console.WriteLine("{0} => {1}", "i", "i".ToUpper())
    Console.WriteLine("{0} => {1}", "I", "I".ToLower())

    ' 現在のスレッドのカルチャをtr-TR(トルコ語/トルコ)に変更
    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("tr-TR")

    Console.WriteLine(Thread.CurrentThread.CurrentCulture)

    Console.WriteLine("Compare CurrentCulture             : {0}", String.Compare("i", "I", StringComparison.CurrentCulture))
    Console.WriteLine("Compare CurrentCultureIgnoreCase   : {0}", String.Compare("i", "I", StringComparison.CurrentCultureIgnoreCase))
    Console.WriteLine("Compare InvariantCulture           : {0}", String.Compare("i", "I", StringComparison.InvariantCulture))
    Console.WriteLine("Compare InvariantCultureIgnoreCase : {0}", String.Compare("i", "I", StringComparison.InvariantCultureIgnoreCase))

    Console.WriteLine("{0} => {1}", "i", "i".ToUpper())
    Console.WriteLine("{0} => {1}", "I", "I".ToLower())
  End Sub
End Class
実行結果
ja-JP
Compare CurrentCulture             : -1
Compare CurrentCultureIgnoreCase   : 0
Compare InvariantCulture           : -1
Compare InvariantCultureIgnoreCase : 0
i => I
I => i
tr-TR
Compare CurrentCulture             : 1
Compare CurrentCultureIgnoreCase   : 1
Compare InvariantCulture           : -1
Compare InvariantCultureIgnoreCase : 0
i => İ
I => ı

トルコ語においては、i(U+0069)とI(U+0049)は大文字小文字の関係にある同じ文字ではなくそれぞれ発音の異なる文字であり、iの大文字はI(U+0049)ではなくİ(U+0131)で、Iの小文字はi(U+0069)ではなくı(U+0130)となります。

そのため、ja-JP(日本語/日本)の場合はCurrentCultureIgnoreCaseで大文字小文字を無視するとi(U+0069)とI(U+0049)は同じ文字として扱われ、tr-TR(トルコ語/トルコ)ではiIは大文字小文字を無視しても異なる文字として扱われます。 一方InvariantCultureIgnoreCaseの場合は、特定の言語に依存しない規則に基づいて比較されるため、ja-JPでもtr-TRでも大文字小文字を無視するとi(U+0069)とI(U+0049)は同じ文字として扱われます。

このように、特定の言語や文化圏に依存した規則に基づいて比較を行いたい場合はCurrentCulture/CurrentCultureIgnoreCase、特定の言語や文化圏に依存しない規則に基づいて比較を行いたい場合はInvariantCulture/InvariantCultureIgnoreCaseを使用する必要があります。