Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套泛型参数_C#_Generics_Generic Programming - Fatal编程技术网

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>>();