Unicode な問題 (2)

解答編。
致命的な問題は、前述の実装では目的のファイルが発見できない場合があるということ。
ローカルの MSDN をキーワード string.Compare でひくと System.String.Compare 以外のトピックが引っかかるはずなので、詳しいことはそちらを見てもらうとして、特定のカルチャにおいて "a".ToUpper() != "A" だったり、"A".ToLower() != "a" であるという考慮が抜けているのが大きな問題点。
このため、".inc" に対して CaseInsencitive で Compare() を呼び出したとしても、"foo.INC" やら "bar.Inc" といったファイルを検出できない。これは設定ファイルなどからファイルを検索する場合にも言えていて、

  string filename = "hoge.inc"; // 設定ファイルなどから読み込む

  if (File.Exists(filename))
  {
    ...
  }

というような実装では、"hoge.INC" がたとえ存在していても、File.Exists() は false を返してしまうということに注意しなければならない。
たとえば、MSDN で例にもなっているトルコ語(tr-TR)では、"i".ToUpper() は İ で、"i".ToLower() は ı です。可逆性はあり、"\u0130".ToLower() は "i" で "\u0131".ToUpper() は "I" になります。このため、MSDN にあるように、string.Compare("FILE", "file", true) は 1(!=0) を返します。

ファイルシステムへの問い合わせはなんとかしてほしいところです。ファイルシステム上の同一視のルールと、Unicode のルールは違うのですから。(他にも、IRC のニックネームの同一視ルールは特殊だったりして、RFC にてきちんと定義されていたりしますね)