c#使用泛型的Upcast

时间:2016-10-19 10:18:37

标签: c# generics casting abstract

我已经使用抽象约束定义了一个抽象类:

abstract class Asset<P> where P : Parm { }
abstract class Parm { }

class StockParm : Parm { }
class Stock : Asset<StockParm> { }

class BondParm : Parm { }
class Bond : Asset<BondParm> { }

List<Asset<Parm>> assets = new List<Asset<Parm>>();
Stock stock;
assets.Add(stock);

但是我收到了错误消息:

  

&#34;无法将类型库存转换为资产&#34;

有没有办法列出所有assets

由于

2 个答案:

答案 0 :(得分:5)

您需要向编译器解释Asset<Derived>Asset<Base>。编译器将泛型类编译为依赖类 - 每个T一个。告诉编译器它“ok”的名称是covariant

MSDN:

  

协方差 - 允许您使用比最初指定的派生类型更多的派生类型。   您可以将IEnumerable(IEnumerable(Of Derived)在Visual Basic中)的实例分配给IEnumerable类型的变量。

Asset<T>更改为界面并添加out keyword

 interface Asset<out P> where P : Parm { }
public static class Program
{
    public static void Main(string[] args)
    {
        List<Asset<Parm>> assets = new List<Asset<Parm>>();
        Stock stock = new Stock();
        assets.Add(stock);
    }
}

public abstract class Parm { }
public class StockParm : Parm { }

public interface Asset<out P> where P : Parm { }    
public class Stock : Asset<StockParm> { }

答案 1 :(得分:0)

请尝试以下

List<Asset<StockParm>> assets = new List<Asset<StockParm>>();