作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了一个带有抽象约束的抽象类:
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);
但是我收到了错误信息:
"Cannot convert type Stock to Asset"
有没有办法列出所有的 Assets
?
谢谢
最佳答案
你需要向编译器解释 Asset<Derived>
是Asset<Base>
.编译器将泛型类编译为 deperate 类 - 每个类一个 T
.告诉编译器“ok”的名称是 covariant .
MSDN:
Covariance - Enables you to use a more derived type than originally specified. You can assign an instance of IEnumerable (IEnumerable(Of Derived) in Visual Basic) to a variable of type 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> { }
关于c# Upcast 与泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40128523/
我是一名优秀的程序员,十分优秀!