代码之家  ›  专栏  ›  技术社区  ›  Sonic Soul

协方差C#

  •  19
  • Sonic Soul  · 技术社区  · 15 年前

    能铸一个吗 List<Subclass> List<Superclass> C 4?

    沿着这些线的东西:

    class joe : human {}
    
    List<joe> joes = GetJoes();
    
    List<human> humanJoes = joes;
    

    协方差的作用不是这个吗?

    如果你能做到:

    human h = joe1 as human;
    

    你为什么不能

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

    因为那个东西已经被铸造了,所以做(乔)人类是不合法的。每个人都会很高兴。现在唯一的选择是创建一个新列表

    5 回复  |  直到 15 年前
        1
  •  26
  •   Jon Skeet    15 年前

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

    Fred Joe List<T>

        2
  •  6
  •   Paw Baltzersen    15 年前

    List<human> humanJoes = new List<human>(joes);
    
        3
  •  2
  •   JaredPar    15 年前

    List<T>

        4
  •  1
  •   Qwertie    15 年前

    IList<T>

    public interface IListReader<out T> : IEnumerable<T>
    {
        T this[int index] { get; }
        int Count { get; }
    }
    

    Contains(T item) IListReader<joe> IListReader<human> Contains(human item)

    IList<joe> IList<human> GoInterface List<human>

        5
  •  0
  •   explorer    15 年前

    List<Joe> joes

      List<Human> humans = joes;
    

    humans joes class Plumber: Human {}

    humans.Add(new Plumber()); // Add() now accepts any Human not just a Joe 
    

    out ABag<T> : ICovariable<out T> ICovariable<Human>

    ICovariable<Human> humans = joes ; // now its good !
    humans.Add(new Plumber()); // error