Joeで話している問題に対してインターフェースを提供するのではなく、デフォルトの実装を提供するつもりなので、ReadOnlyCollectionBaseのベースクラスを提供しています。 しかし、強いタイプではないから使いたがらない人もいるのも理解できます。 しかしジェネリックの導入により、ReadOnlyCollectionも登場<T>しました。これにより、同じ機能だけでなく強力なタイプも提供できます。素晴らしいです! ReadOnlyCollection<T>は密閉クラスではないため、必要に応じて自分のコレクションをフルスピードで書くことも可能です。 このために作成したこれらのコレクションは一般的なニーズに適応できるため、同じコンセプトのインターフェースを導入する予定はありません。
驚くかもしれませんが、読み取り<T>専用コレクションに使用する予定の2つのインターフェースはIListとIListです。 どちらもIsReadOnlyというブール属性を持ち、読み取り専用コレクションがこのプロパティを実装するとtrueが返るはずです。 純粋な読み取り専用インターフェースを追加したくない理由は、基本ライブラリに不必要な複雑さを加えすぎると感じているからです。 複雑さの観点からは、この新しいインターフェースとその消費者の両方を指します。 APIデザイナーが実行時にIsReadOnlyプロパティや例外を確認しないなら、この場合はIListインターフェースを使っても問題ないと考えています。 もし一度に本当にクリーンなカスタムAPIを提供してくれるなら、今回はIListインターフェースの実装を見せて、カスタマイズされた読み取り専用APIを公開すべきです。 後者はオブジェクトモデルから公開されたコレクションに典型的な方法です。
この方法が機能する理由は、これらの読み取り専用インターフェースが純粋に読み書きインターフェースのサブセットであるためで、それは妥当な仮定のように思えます。 残念ながら、この前提は現実とは一致しません。なぜなら、各インターフェースのメタデータレベルでの各メソッドには独自のスロットがあるからです(これにより明示的なインターフェース実装が機能します)。
この設計も検討しましたが、Count属性のみを提供する型を追加するだけでは基本ライブラリに大きな価値は加えられないと感じました。 ベースライブラリチームでは、APIがマイナス1000から始まる場合、価値を提供するだけでは追加を正当化するには不十分だと考えています。 新しいAPIを追加する理由にはコストも含まれます。例えば、開発者は選択肢が増えるためです。 最初は、この型を追加すれば、単にカウントを取って面白いことをしたい場合にコードのパフォーマンスが良くなると思っていました。 例えば、既存のコレクションに一括で追加する場合などです。 しかし、これらのシナリオでは、私たちはIEnumerableインターフェースのみ、<T>そして<T>ICollectionインターフェースを実装するインスタンスを持つ特別な場合に限り、利用することを推奨しています。 すべての組み込みコレクションタイプがこのインターフェースを実装して以来、これらの最も一般的なシナリオでパフォーマンス向上は見られていません。 ちなみに、<T>IEnumerableの拡張メソッドCount()もこれが可能です。