为什么非泛型派生类型必须为泛型基类C#指定类型参数

在Andrew Tolson的Pro C#中,作者说当非泛型类扩展泛型基类时,派生类必须指定类型参数.

// Assume you have created a custom
// generic list class.
public class MyList<T>
{
  private List<T> listOfData = new List<T>();
}
// Non-generic classes must specify the type
// parameter when deriving from a
// generic base class.
public class MyStringList : MyList<string>
{}

我不明白为什么这是必要的?

最佳答案
好吧,非泛型类没有类型参数,泛型类有一个或多个类型参数.

如果从泛型类继承该类,而不指定type参数,则仍然具有泛型类,即

public class MyList<T> : List<T> {} //MyList is still generic

public class MyList : List<T> {} //invalid declaration, what is T ?

所以

public class MyStringList : List<string> {} //specified with string

或者,更一般的

public class MyArrayList : List<object> {} //specified with object

一个更罗嗦的解释,主要是因为我喜欢使用“arity”这个词.

CLR中的类可以具有零或更多的arity,这意味着它们可以指定零个或多个类型参数.但是,CLR无法实例化具有非零arity的类,因此为了做任何有用的事情,必须将类的arity降低到零.

这意味着,虽然我们可以部分指定类,如:

public class IntKeyDictionary<TValue> : Dictionary<int, TValue>

减少arity,甚至声明类似的类

public class ListAndAHalf<TOne, TTwo> : List<TOne>

增加arity,故事必须以一个arity为0的类结束,如List< string>,Dictionary< int,double>等等…

转载注明原文:为什么非泛型派生类型必须为泛型基类C#指定类型参数 - 代码日志