为什么C#不支持泛型泛型(带参数化类型的泛型)?

Ale*_*lec 5 .net c# generics generic-collections nested-generics

最近(可能是设计缺点)当我需要有一个未修复的MyType<T>地方集合时T(即整个集合中有多个不同的泛型实例),我遇到了常规任务.

由于它被广泛提出(对于这种情况),宣布了一个抽象类:

public abstract class MyType {}
public class MyType<T>: MyType {}
Run Code Online (Sandbox Code Playgroud)

然后我收集了一些MyType.但是对于这个集合,我有一个约束,即任何类型的元素都不超过一个T.

因此,我做了一些自定义实现ICollection<TBase>.我想在其中包含一个Get<TParam>()获取与类型对应的项的方法TParam.以后用作:

MyCollection<MyType> collection = new MyCollection<MyType>();
MyType<int> myInt = collection.Get<int>();
Run Code Online (Sandbox Code Playgroud)

但是我意外地发现我甚至无法宣布它:

public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } //this won't compile
Run Code Online (Sandbox Code Playgroud)

因为内部泛型(或所谓的"泛型泛型")既不支持C#也不支持.NET(我想).您如何看待这些限制背后是否存在任何具体原因(复杂性除外)?

更新1.询问编译器版本和编译器错误.

Microsoft C#,.NET 3.5(Visual Studio 2010).错误:

错误CS0081:类型参数声明必须是标识符而不是类型

错误CS0246:找不到类型或命名空间名称"TCustom"(您是否缺少using指令或程序集引用?)

更新2.被问及我是否需要修复或解释原因.我真的想知道为什么.但如果你有解决问题的好方法,也欢迎你.

更新3. 此博客文章中可能已经回答了这个问题.似乎CLR团队面临着不要过度复杂化语言的巨大压力.

Max*_*xem 0

你到底为什么需要

public TCustom<TParam> Get<TParam, TCustom<TParam>>() { } 
Run Code Online (Sandbox Code Playgroud)

当通用类型(在你的例子中为 MyType)已知时,你不能这样做吗

public MyType<TParam> Get<TParam>() { 
  return (MyType<TParam>)_items.FirstOrDefault(i => i is MyType<TParam>);
}
Run Code Online (Sandbox Code Playgroud)

或者我错过了什么?