c# Upcast 与泛型
c# Upcast with generics
我定义了一个带有抽象约束的抽象 class :
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> { }
请尝试以下操作
List<Asset<StockParm>> assets = new List<Asset<StockParm>>();
我定义了一个带有抽象约束的抽象 class :
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> { }
请尝试以下操作
List<Asset<StockParm>> assets = new List<Asset<StockParm>>();