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。对于这样一个复杂的泛型,你的用例到底是什么?(真正感兴趣)是的,这是有道理的。不过,当你第一次看到这一点时,它并不明显。我认为,它给出的错误是误导性的