KeyNotFound exception
『Kazzの「JとNの狭間で」』より.
従って.NET1.1で上記のようにインデクサを使用してアクセスしていた辞書をGenericに書換えた場合、存在チェックのコードは以下のどちらかのように書換える必要が出てきます。
状況を整理すると,
- .NET 1.1 では,Dictionary に格納される value は常に object として扱われていた(のでインデクサが null を返すのもあり).
- ただしインデクサで null を返すと,「本当に null が格納されていたのか」,「見つからなかったから null を返したのか」がはっきりしない.
- .NET 2.0 の Generics 版 Dictionary ではインデクサも型付けされるため,
参照型値型を返す場合に null が使えない*1.
という感じでしょうか.まあ C# 1.0 から C# 2.0 への書き換えで注意すべきというのは確かですな.
ちなみに Visual Studio 2005 で疑問に思ったことは Product Feedback Center で検索してみると結構いい S/N 比で情報が得られるような気がしています.困ったときのおすすめ.上のまとめも Product Feedback Center での検索結果を参考にして作りました.
KeyNotFoundException での検索結果 からいくつかチョイスしてみると,
- Bug Details: Generic SortedList throws KeyNotFound exception on item access
- Suggestion Details: .NET 2.0 Dictionary/SortedDictionary should not throw KeyNotFoundException in indexer
*1:となるとまあ Nullable の出番なんでしょうけど