0

我有一个叫做实体的基类。然后我有两个子类标签和继承自实体的属性。现在我想要一个存储实体列表的字典。但我无法让它工作。是否错误地进行了继承?

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>不会自动从 a 继承List<Base>,并且它们不能互换使用。这样做的原因是列表是一个可变结构,即可以添加、删除和修改元素。
例如,如果我有 aList<Dog>和 aList<Cat>列表,并且我能够将它们视为 a 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无法添加或修改集合,只需枚举它,因此任何有趣的业务都被定义为不受欢迎。这称为Generic Type Covariance,如果您想了解更多关于该主题的信息,可以查看Eric Lippert 的几个很棒的博客。

于 2012-09-14T11:57:57.810 回答
3

您有一个字典,其中包含一个List<Entity>键 ( 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 (它只能处理对象,不能处理其他对象的实例)会很危险自身的子类或实例)。但是,只允许您检查集合的内容,而不是添加到集合中,并且可以肯定地说 a 中的所有内容都是.List<Entity>List<Entity>EntityList<Tag>TagEntityEntityIEnumerable<Entity>List<Tag>Entity

于 2012-09-14T11:56:19.450 回答