c#使用泛型向上转换

c#使用泛型向上转换,c#,generics,casting,abstract,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&g

我定义了一个带有抽象约束的抽象类:

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);
抽象类资产

其中P:Parm{} 抽象类Parm{} 类StockParm:Parm{} 类别股票:资产{} 类BondParm:Parm{} 类别债券:资产{} 列表资产=新列表(); 股票; 资产。增加(股票);

但我已收到错误消息:

“无法将类型股票转换为资产”

是否有办法列出所有
资产


谢谢您需要向编译器解释
Asset
Asset
。编译器将泛型类编译为独立类-每个
T
一个。告诉编译器它是“ok”的名称是

MSDN:

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

Asset
更改为界面并添加:

接口资产,其中P:Parm{}

公共静态类程序
{
公共静态void Main(字符串[]args)
{
列表资产=新列表();
股票=新股票();
资产。增加(股票);
}
}
公共抽象类Parm{}
公共类StockParm:Parm{}
公共接口资产,其中P:Parm{}
公共类股票:资产{}

请尝试以下操作

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

可能重复的接口我同意接口在这里很有用。关键字
out
表示协方差,而不是逆方差-
in
关键字。@kiziu-纠正了我的错误+添加了解释
out
关键字的内容。谢天谢地,他想声明一个
资产参数列表
,然后将其转换为
资产参数
,这是
逆变的典型情况
,但这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。-@玛莎明白了。谢谢
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> { }
List<Asset<StockParm>> assets = new List<Asset<StockParm>>();