嵌套泛型 <T1<T2>>

5
为什么不可能写出这样的代码:
T1<T2> Method<T1, T2>(T1<T2> genericValue) { ... }

例如,我想编写一个扩展方法,接受一个包含通用集合的通用对象:
Container<CT<T>> ExtensionMethod<CT, T>(Container<CT<T>> value) { ... }

CT可以是数组、列表或任何其他集合类型,T可以是任何类型。但编译器会提示“类型参数T1没有类型参数”。

有没有什么解决方法?


Container<CT<T>> ExtensionMethod<CT, T>(Container<CT<T>> value) where CT : IEnumerable<T> { ... } 其中 CT : IEnumerable<T>,表示 CT 是实现了 IEnumerable<T> 接口的类型。 - bassfader
1
即使您可以这样做,您如何获取类型为“T”的包含对象?如果容器实现了像ICollection<T>或IEnumerable<T>这样的公共接口,则应为其中一个添加扩展类或使用where子句指定。 - Lithium
@Lithium 我试过了,但是我需要明确指定类型,因为它们无法从使用中推断出来。这不是很方便。所以我决定也将其变成通用的,但它无法编译。现在我很好奇,为什么它不能编译。 - Alex Butenko
如果你想让 CT 成为任何类型的集合,请确定你想要使用的所有集合所支持的接口,该接口还应该给方法提供完成其预期任务所需的所有工具,并且使用该接口代替 CT。 - Lasse V. Karlsen
你到底有什么使用这种复杂泛型的用例呢?(真心感兴趣) - Mardoxx
1个回答

7

这是不可能的。你的泛型必须能够编译任何 T。因此,如果你对 T 做出任何假设,除了它是 object,你必须使用 where 关键字添加约束。

这个约束系统并不是很复杂。你不能添加一个要求 T 是只有一个泛型类型参数的类的约束条件。所以你想做的事情在当前的工具集下是不可能的。

你需要问问微软为什么没有实现它,但似乎他们认为商业价值不足。

也许你可以问一个如何实现某个功能的问题,而不是将其分解为泛型。看起来你可能遇到了一个 XY 问题


是的,这很有道理。不过,第一次看到这个时,它并不明显。而且它给出的错误信息是误导性的,我认为。 - Alex Butenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接