2

これらのクラス、アクティブ レコード パターンの実装があります。

public abstract class RecordCollection<T> : ObservableCollection<T> where T : Record
public abstract class Record : INotifyPropertyChanged

データベース (連絡先) の行を定義するたびに、次のような新しいレコード クラスを作成します。

public class Contact : Record

およびデータベースの行のコレクション (つまり、連絡先) は次のとおりです。

public class ContactCollection : RecordCollection<Contact>

しかし、その後、ジェネリックを使用してレコードコレクションを含めることはできません:

ContactCollection contColl = new ContactCollection(databaseman dbMan);
contColl.Load();

RecordCollection<Record> recordColl = contColl;

「ContactCollection型を暗黙的に>に変換できません」というメッセージが表示されます。どんな助けでも大歓迎です。

4

1 に答える 1

6

これが起こる可能性があるという理由だけで、このキャストは許可されていません。

public class AnotherTypeOfContact: Record {}

これで、次のことができます。

recordColl.Add(new AnotherTpyeOfContact()) //runtime exception as no conversion between AnotherTypeOfContact and Contact

これは、ジェネリック型間の共分散分散(詳細はこちら)と呼ばれるものです。これが機能するにcontCollは、「出力」のみのインターフェイスを実装する必要がありますが、実装されていません。これは、型の安全性を維持contCollするために、項目を追加できないことを意味します (より正式にTは、メソッドの戻り値の型のみにすることができます)。

配列ではこれ許可されていますが、共分散が壊れていることに注意してください。これは残念なことです:詳細はこちら

于 2011-06-25T16:20:42.247 に答える