当前位置: 首页 > 知识库问答 >
问题:

为什么列表允许添加新的子项,但不允许从列表分配

有品
2023-03-14

这可能是一个复制品。但是经过一天的研究,我希望你能宽大处理。这是一个关于协方差的问题。

为什么我能这么做?

List<Animal> allAnimals = new List<Animal>();
allAnimals.Add(new Dog());
allAnimals.Add(new Cat());

但不能这样做吗?

List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;

我读了一些关于协方差的讨论。

“C#中的协方差”

“将列表转换为接口列表”

“转换列表到接口列表”

我的理解是,我不能将狗的名单添加到动物名单中,因为这样我就可以将猫添加到动物名单中,这将是危险的。但是在动物列表中添加一个猫或狗的例子也同样危险,不是吗?在我看来,C#还没有决定是否信任我。

共有1个答案

宰父霖
2023-03-14

假设您理解为什么可以将实例传递给接受动物的方法,下面是不允许使用后一个示例的原因:

List<Dog> aBunchOfDogs = new List<Dog>();
allAnimals = aBunchOfDogs;
allAnimals.Add(new Cat()); // Fine because allAnimals is List<Animal>

foreach (var dog in aBunchOfDogs)
{
    dog.Woof(); // The Cat can't woof
}
 类似资料:
  • 问题内容: W3指定表列(带有元素)仅允许使用四个CSS规则- 边框,背景,宽度和可见性。 有人知道这个决定的原因吗?如果可以使用边框和背景,为什么不使用字体和颜色呢? 问题答案: IanHixie在这里详细解释:为什么只有四个属性应用于表列的奥秘。相关报价: 文本的颜色取决于其元素的“颜色”属性。除非指定,否则“ color”属性(基本上)默认为“ inherit”,这意味着“采用父元素的值”。

  • 我试图执行我的保存endpoint到邮递员,我收到这个错误: 原因:org.h2.jdbc.JdbcBatchUpdateException: NULL不允许列CREATION_DATE;SQL语句:插入到客户(authentication_uid、creation_date、customer_uid、default_payment_method_uid、guid、last_edit_date、p

  • 问题内容: 我有一个要添加位列的表,对于所有现有数据,我希望将其默认设置为false。 如何更改表,使其在为现有行插入false之前可以指定NOT NULL? 我是否应该将其创建为可为空,而不是将其切换为不可为空? 问题答案: 您可以添加该列并提供用于所有现有行的默认值。

  • 问题内容: 我想做这样的事情: 不幸的是,列表追加未返回修改后的列表。 那么,我如何允许返回新列表? 问题答案: 不要使用追加而是串联: 这将返回一个 新 列表。不会受到影响。如果你需要有受影响的 还有 既可以使用,无论如何,然后分配分开(复印件)。

  • 问题内容: 最初,表“ MyTable”的定义如下: 如何以允许“ Col 3”列为NULL的方式更新它? 问题答案: 以下MySQL语句应修改您的列以接受NULL。

  • 问题内容: 编辑:当我说“ SQL Server”时,我实际上是在谈论Management Studio。 抱歉,这令人困惑。 哦,我讨厌这种事情发生。昨天我在使用SQL Server,并尝试使用PIVOT命令来弄清楚它是如何工作的。因此,我创建了一个包含四列的新表,第一列的前几行将具有相同的值。 我在第一行,第一列中添加了“ value1”,然后按回车键–因为还没有添加任何键或约束,它使我可以向