我正在使用.net 3.5框架。 下面是我的代码。
class Base {}
class Derived : Base {}
class Program {
static Main() {
IList<Base> base_col = new List<Base>();
base_col.Add(new Derived()); // Do you think this line code is good?
}
}
您认为仿制药是检查类型的好主意吗?
我会先走一步。
static Main() {
IList<Derived> base_col = new List<Derived>();
Process(base_col); // error.
}
static Process(IEnumarable<Base> baseCollection) { }
为什么代码会在此处中断?
答案 0 :(得分:1)
由于Derived
也是Base
,所以显示的代码没有任何问题 - 它与泛型无关。
关于您的编辑:您提供的代码在.NET 4中工作,其中IEnumerable<>
接口是逆变的。之前的版本没有使用此功能(从V2开始,支持接口中的协同/反演显然已经在CLR中,但是在.NET Framework的V4之前没有语言使用该功能发出代码。)
对于这种特定情况,您可以安全地使用Cast<>
LINQ函数:
static Main() {
IList<Derived> base_col = new List<Derived>();
Process(base_col.Cast<Base>());
}