F#の配列(Array)を辞書(Dictionary)のキーにしちゃいかん!!代わりにタプル(tuple)を使おう

すごいハマった。

let dic = new System.Collections.Generic.Dictionary<int option [], string>()
dic.[[|Some 1; Some 1|]] <- "A"
dic.[[|Some 1; Some 2|]] <- "B"
dic.[[|Some 1; Some 3|]] <- "C"

というコードをを実行しても

System.Collections.Generic.KeyNotFoundException: 指定されたキーはディレクトリ内に存在しませんでした。
   場所 System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   場所 <StartupCode$FSI_0141>.$FSI_0141.main@()
エラーのため停止しました

となって死ぬ。多分、キーとして値丸コピーしてるんじゃなくて、アドレスだけメモってるんだろうな。代わりにtuple使っとけってことっぽい。こっちはちゃんと取れる。

let dic = new System.Collections.Generic.Dictionary<(int option*int option), string>()
dic.[(Some 1, Some 1)] <- "A"
dic.[(Some 1, Some 2)] <- "B"
dic.[(Some 1, Some 3)] <- "C"
dic.[(Some 1, Some 3)]