泛型是为了型号沉重?派生类型怎么样?

时间:2012-08-27 13:14:16

标签: generics c#-3.0

我正在使用.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) { } 

为什么代码会在此处中断?

1 个答案:

答案 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>());
}