以下のようなstring.IndexOfメソッドを使った場合、ResharperはStringComparison.Ordinalの指定を推奨してきます。
var text = "Are You Happy?"; var index = text.IndexOf("Happy");
以下の説明に記載されています。
The canonical example is the Turkish where there is a lowercase dotless "ı" with the corresponding uppercase "I", and a lowercase "i" with an uppercase "İ" with the dot.
トルコ語では、
- ドットなしの "ı"が小文字で、対応する大文字がI
- ドットがついたiが小文字で、対応する大文字はドットのついた"İ"
言語によっては必ずしもiが小文字、大文字はI(エルではなくアイです)という訳ではないのです。
といったように言語ごとに異なるため、StringComparison.Ordinalの指定が推奨されています。
いちいち面倒だなと思えてきますが、GitHubなどで海外のソースを共有した時、自分のアプリが海外で動作する時などにネックになるでしょう。
StringComparison.Ordinalの挙動については以下で詳細がわかります。
スウェーデンのæという文字列はaeとStringComparison.InvariantCultureやStringComparison.CurrentCultureでは同じと判断されます。
この文字はaとeの合字だからか、言語設定がスウェーデンでも英語でもそうなります。
ただし、StringComparison.Ordinalとすると別として扱われます。
aとeの合字であれば、aeとした時も部分一致された方が検索とかは扱いやすい? うーん、考えるとややこしくなってきた・・・。