泛型推导

本文关键字:泛型 | 更新日期: 2023-09-27 18:03:50

我有这样的情况:

public interface I {}
public class D1 : I {}
public class D2 : I {}
public class A
{
    public List<D1> Collection {get;set;}
    //Other Members
}
public class B
{
    public List<D2> Collection {get;set;}
    //Other Members
}

因此,A和B都有一个List,其元素派生自i。

如何定义A和B的基类?

注:我试图泛化基类:

class Base<T> where T : I
{
   List<T> Collection {get;set;}
}
A:Base<D1>{..}; B:Base<D2> {..}

但是它没有给我任何东西(或者我只是这样认为):我不能这样做:

Base<I> b; b= new A(); b= new B();

因为不可能从List<I>铸入List<D1>

谢谢

泛型推导

仔细想想,这是有道理的。

考虑一下:

Base<I> b = new B();
b.List.Add(new D1);

理论上,这将是有效的代码。Base<I>.ListList<I>D1继承自I。但是我们知道List实际上是List<D2>(在B中定义)。因此,对Add的调用不可能工作。

如果你不需要添加项目到集合,你可以改变一些东西使它工作:

public interface IBase<out T> where T : I
{
    IEnumerable<T> Collection { get; }
}
public class A : IBase<D1>
{
    IEnumerable<D1> Collection { get; private set; }
    public A(IEnumerable<D1> list)
    {
        Collection = list;
    }
}
public class B : IBase<D2>
{
    IEnumerable<D2> Collection { get; private set; }
    public B(IEnumerable<D2> list)
    {
        Collection = list;
    }
}