0

エンティティと呼ばれる基本クラスがあります。次に、2 つの子クラス Tag と、Entity から継承する Property があります。今、エンティティのリストを格納する辞書が必要です。しかし、私はそれを機能させることができません。継承を間違って行いましたか?

Dictionary<string, List<Entity>> baseDict = new Dictionary<string, List<Entity>>();

List<Tag> tags = new List<Tag>();
tags.Add(new Tag("2012"));
tags.Add(new Tag("hello"));
tags.Add(new Tag("lego"));
List<Properties> properties = new List<Properties>();
properties.Add(new Properties("Year"));
properties.Add(new Properties("Phrase"));
properties.Add(new Properties("Type"));

baseDict.Add("Tags", tags);
baseDict.Add("Properties", properties);
4

3 に答える 3

5

これはよくある間違いです。

AList<Derived>は自動的にを継承せずList<Base>、互換的に使用することはできません。これは、リストが変更可能な構造であるためです。つまり、要素を追加、削除、および変更できます。
たとえばList<Dog>List<Cat>リストとリストがあり、それらをとして扱うことができたList<Mammal>場合、次のコードが可能になります。

List<Dog> dogs = new List<Dog>();  //create a list of dogs
List<Mammal> mammals = dogs;   //reference it as a list of mammals
List<Cats> cats = mammals;  // reference the mammals as a list of cats (!!?!)
Cat tabby = new Cat();
mammals.Add(tabby)   // adds a cat to a list of dogs (!!?!)

ただし、リストが不要で、コレクションのみが必要な場合(および、C#4以降を使用している場合)、ディクショナリをとして定義できますDictionary<string, IEnumerable<Entity>>。コレクションを追加または変更するIEnumerableことはできませんが、それを列挙するだけなので、おかしな忙しさは当然のことながら無視されます。これはGenericTypeCovarianceと呼ばれ、このテーマについて詳しく知りたい場合は、EricLippertのすばらしいブログがいくつかあります。

于 2012-09-14T11:57:57.810 に答える
3

List<Entity>キーごとに保持する Dictionary があります ( string)。List<Tag/Properties>をそのまま保存する必要がありEntitiesます。

Dictionary<string, List<Entity>> baseDict = new Dictionary<string, List<Entity>>();

List<Entity> tags = new List<Entity>();
tags.Add(new Tag("2012"));
tags.Add(new Tag("hello"));
tags.Add(new Tag("lego"));

List<Entity> properties = new List<Entity>();
properties.Add(new Properties("Year"));
properties.Add(new Properties("Phrase"));
properties.Add(new Properties("Type"));

baseDict.Add("Tags", tags);
baseDict.Add("Properties", properties);
于 2012-09-14T11:55:21.353 に答える
1

Dictionary<string, IEnumerable<Entity>>代わりに使用すると機能します。

aが期待されるList<Tag>場所で aを使用できない理由は、 a のように見えるもの(オブジェクトを追加できることを意味します) を持つのは危険だからです。サブクラスまたはそれ自体のインスタンス)。ただし、コレクションに追加することはできず、コレクションの内容を確認することしかできません。 a 内のすべてが.List<Entity>List<Entity>EntityList<Tag>TagEntityEntityIEnumerable<Entity>List<Tag>Entity

于 2012-09-14T11:56:19.450 に答える