タイトル : Re^3: KeyedCollectionについて 投稿日 : 2008/05/20(Tue) 09:51 投稿者 : よねKEN
土日ばたばたしていてすっかり返信するのを忘れていました。申し訳ないです。 (昨日は体調を崩して休んでおりました) > 書いたつもりだったのですが説明がわかりづらくなってしまい申し訳ありません。 > 作成したクラスで宣言した変数を中断モードの状態でマウスカーソルを当てると > "Count = 型 '{TypeLoadException}' の例外が発生しました" > というツールチップが表示されます。 > ビルド自体は問題なく通り、実行時にも例外によって中断されることはありません。 明確な根拠を示せないのですが、調べたり実験したりした範囲では、 IDE周辺の不具合の可能性が高いと思っています。 (ちなみに試したのはVS2008でしたが、同じ現象を確認しました) > よねKEN様が提示していただいた空実装で次のコードを実行していただき > 2行目以降で中断モードにして変数xの上にマウスカーソルを合わせると > 例外を確認できると思います。 > > Dim x As New MyCollection(Of String, Object) > x.Add("item1") > > 型パラメータの定義がTValueのみの場合は例外は発生しません。 イミディエイトウィンドウで、 ? x でも同様のことを確認できますね。 ? x.Count なら問題なく表示されます。 List<T>やDictionary<TKey, TValue>ではどうなるかを確認してもこの現象は発生しませんでした。 > > しかし、具体的に実装しようとした場合、 > > TValue型がどんな型かを予め知っていないとこのメソッドを実装して > > TKey型を返すのは困難なように思います。(条件により不可能ではないと思いますが) > > > > そういう意味で、KeyedCollectionを継承する場合、 > > TKeyやTValueについては閉じた型(型パラメータを含まない具体的な型)を > > 指定して継承するものではないかと思います。 > > 実際の実装ではTValueはキーにする値を持った抽象クラス(独自に定義)のみに制約し、 > その値の型はTKeyにより決定されるようにしているためGetKeyForItemメソッドの > 戻り値を返すことができます。 制約を付けているのであれば、私の危惧したところは問題ないですね。 > 抽象クラスを継承したクラスを定義するだけで色々な型に対応できるので > 汎用的に利用できるかなと思ってこのような実装にしてみました。 実装としては特に問題ないと思うのですが、本題の現象の理由がわからないと ちょっと気持ち悪いですね。 KeyedCollection<TKey, TItem>とその親のCollection<T>のソースコードを追ってみましたが、 今回の現象に繋がりそうな感じのする箇所は見つけられませんでした。 あまりお役に立てそうにありませんね(^^; |