最近(可能是由于设计缺陷),我面临一个常规任务,需要有一个MyType<T>
的集合,其中T
不是固定的(即在一个集合中多个不同的泛型实例化)。
由于这种情况经常被提出,因此声明了一个抽象类:
public abstract class MyType {}
public class MyType<T>: MyType {}
然后我有一个
MyType
的集合。然而,对于这个集合,我有一个约束条件,即任何类型T
最多只能有一个元素。因此,我进行了一些
ICollection<TBase>
的自定义实现。我想在其中包括一个方法Get<TParam>()
,用于获取与类型TParam
相对应的项目。稍后可以像这样使用:MyCollection<MyType> collection = new MyCollection<MyType>();
MyType<int> myInt = collection.Get<int>();
然而我意外地发现,我甚至无法声明它:
public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } //this won't compile
因为C#和.NET都不支持内部泛型(或所谓的“泛型的泛型”)。你认为除了复杂性之外,是否有任何特定原因限制了这种情况? 更新1。 请求编译器版本和编译器错误。
Microsoft C#,.NET 3.5(Visual Studio 2010)。 错误:
错误CS0081:类型参数声明必须是标识符而不是类型 错误CS0246:找不到类型或命名空间名称“TCustom”(是否缺少使用指令或程序集引用?) 更新2。 问我是否需要修复或解释原因。我真的想知道为什么。但是如果您对问题有好的解决方案,也欢迎您。 更新3。 这个问题可能已经在this blog post中得到回答。看起来CLR团队承受着不过度复杂化语言的巨大压力。