Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# 嵌套泛型<;T1<;T2>&燃气轮机;_C#_Generics - Fatal编程技术网

C# 嵌套泛型<;T1<;T2>&燃气轮机;

C# 嵌套泛型<;T1<;T2>&燃气轮机;,c#,generics,C#,Generics,为什么写这样的东西是不可能的: T1<T2> Method<T1, T2>(T1<T2> genericValue) { ... } T1方法(T1通用值){…} 例如,我想编写一个扩展方法,它接受一个泛型对象,包含一个泛型集合: Container<CT<T>> ExtensionMethod<CT, T>(Container<CT<T>> value) { ... } 容器扩展方法(容器值)

为什么写这样的东西是不可能的:

T1<T2> Method<T1, T2>(T1<T2> genericValue) { ... }
T1方法(T1通用值){…}
例如,我想编写一个扩展方法,它接受一个泛型对象,包含一个泛型集合:

Container<CT<T>> ExtensionMethod<CT, T>(Container<CT<T>> value) { ... }
容器扩展方法(容器值){…}
其中,CT可以是数组、列表或任何其他集合类型,而T可以是任何类型。但编译器说“类型参数T1并没有类型参数”


有什么解决办法吗?

这是不可能的。您的泛型必须针对任何
T
进行编译。因此,如果您对
T
进行任何假设,而不是假设它是
object
,则必须添加关键字约束

这个约束系统不是很复杂。不能添加要求
T
为仅包含一个泛型类型参数的类的约束。因此,使用当前的工具集,您想要做的是不可能的

你需要问微软为什么他们没有实施它,但他们似乎没有看到足够的商业价值


也许你可以问一个问题,如何实现某个东西,而不是把它分解成泛型。似乎您可能有一个.p>
容器扩展方法(容器值),其中CT:IEnumerable{…}
?即使您可以这样做,您如何获得类型为
T
的包含对象?如果容器实现了一个公共接口,如
ICollection
IEnumerable
,那么您应该为其中一个添加一个扩展类,或者使用
where
子句指定该扩展类。@li我尝试过,但随后需要显式指定类型,因为它们无法从用法中推断出来。而且也不是很方便。所以我决定让它也通用,但它不编译。所以现在我很好奇,为什么它不是。如果你想让CT成为任何类型的集合,那么确定你想要使用的所有集合都支持哪个接口,这也为方法提供了它所需要的所有工具来完成它想要做的事情,并使用该接口而不是CT。对于这样一个复杂的泛型,你的用例到底是什么?(真正感兴趣)是的,这是有道理的。不过,当你第一次看到这一点时,它并不明显。我认为,它给出的错误是误导性的