一尘不染

C#中的协方差

c#

是否有可能投下List<Subclass>List<Superclass>在C#4.0?

遵循以下原则:

class joe : human {}

List<joe> joes = GetJoes();

List<human> humanJoes = joes;

这不是协方差吗?

如果可以的话:

human h = joe1 as human;

你为什么不能够做

List<human> humans = joes as List<human>;

(joe)humans [0]是不合法的,因为该项目已被拒绝投放。..每个人都会很高兴。现在唯一的选择是创建一个新列表


阅读 256

收藏
2020-05-19

共1个答案

一尘不染

您无法执行此操作,因为它并不安全。考虑:

List<Joe> joes = GetJoes();    
List<Human> humanJoes = joes;
humanJoes.Clear();
humanJoes.Add(new Fred());
Joe joe = joes[0];

显然,最后一行(如果不是更早的那一行) 必须 失败-因为a Fred不是a Joe。的不变性List<T>可防止在 编译
时而不是执行时发生此错误。

2020-05-19