use*_*273 3 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);
Run Code Online (Sandbox Code Playgroud)
但是我收到了错误消息:
"无法将类型股票转换为资产"
有没有办法列出所有assets?
谢谢
你需要解释,编译器Asset<Derived>是Asset<Base>.编译器将泛型类编译为依赖类 - 每个类一个T.告诉编译器它是"ok"的名称是协变的.
MSDN:
协方差 - 使您可以使用比最初指定的派生类型更多的派生类型.您可以将IEnumerable(IEnumerable(Of Derived)在Visual Basic中)的实例分配给IEnumerable类型的变量.
切换Asset<T>到界面并添加out关键字:
interface Asset<out P> where P : Parm { }
Run Code Online (Sandbox Code Playgroud)
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> { }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |