C# 嵌套泛型参数
是否可以嵌套泛型参数,如C# 嵌套泛型参数,c#,generics,generic-programming,C#,Generics,Generic Programming,是否可以嵌套泛型参数,如类MyClass{} 我尝试了一些方法,得到了以下有效的代码,但类声明需要接收两个分开的参数: class MyClass1<TG, TM> where TM : MyType where TG : OtherType<TM> { public TM DoSomething() { } public TG DoSomething2() { } } 类MyClass1 其中TM:MyType 其中
类MyClass{}
我尝试了一些方法,得到了以下有效的代码,但类声明需要接收两个分开的参数:
class MyClass1<TG, TM>
where TM : MyType
where TG : OtherType<TM> {
public TM DoSomething() {
}
public TG DoSomething2() {
}
}
类MyClass1
其中TM:MyType
其中TG:OtherType{
公共TM剂量测定法(){
}
公共TG剂量表2(){
}
}
这是唯一的办法吗
编辑:
如您所见,我需要类中的两个通用参数(同时使用:TM和TG的成员),因此TG是一个通用参数,不能是一个类型(在这种情况下),答案和注释建议我“硬编码”两个参数中的一个对这个问题没有帮助
好的,有了上面的示例,我们可以像这样使用它(并且有效):
newmyclass();
在我的例子中,第二个参数始终与第一个参数的嵌套参数相同。所以,我问我们是否可以省略第二个参数,编译器从第一个参数的参数推断出它
这样做是否有可能取代两个独立的参数?这取决于您想要实现的目标。如果希望
MyClass1
具有两个不同的泛型参数,那么您展示的代码就是最佳选择
classmyclass{}
:这实际上意味着MyClass
有一个泛型参数。您正在传入TG
,这意味着TG
也是一个泛型类,它接收TM
作为其泛型参数
因此,要使该代码正常工作,您需要以下内容:
class TM {}
class TG<T> {}
class MyClass<T> {}
class TM{}
类TG{}
类MyClass{}
现在,你可以称之为:
new MyClass<TG<TM>>();
newmyclass();
为什么使用两个常规通用参数是个问题?您应该描述您正在尝试做什么以及为什么使用它不起作用。您的无效语法对编译器有不同的意义吗?或者你只是对美学不满意?你想要的是MyClass1
只有一个参数,它本身就是另一个泛型类型;因此,请尝试MyClass1 where TG:IEnumerable where TM:MyType
。当DoSomething2返回TG
时,如何使用TG
类型(包括MyClass1
的内部和外部)?您可以将TG
的所有引用替换为IEnumerable
,只需去掉TG
类型参数即可。
new MyClass<TG<TM>>();