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.被问及我是否需要修复或解释原因.我真的想知道为什么.但如果你有解决问题的好方法,也欢迎你.
你到底为什么需要
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)
或者我错过了什么?