【发布时间】:2018-09-29 06:15:29
【问题描述】:
我有一个名为Structure<A, E, B, V, K> 的类,它通过接口继承了一个泛型方法FireEdges<TA, TE, TB, TV, TK>(Func<TE, TK> transformer)。
我想根据传递给FireEdges 的类型是否与实例类型匹配来运行不同的代码。
例如,如果我有:
Structure<int, int, int, int, int> s = new ...
如果我打电话给s.FireEdges<int, int, int, int, int>(Func<int, int> transformer)
例如,与调用s.FireEdges<A, B, C, D, E>(Func<B, E> transformer) 相比,它应该运行单独的代码。
为此,我尝试过这样做:
public override void FireEdges<TA, TE, TB, TV, TK>(Func<TE, TK> transformer) {
if (typeof(TE) == typeof(E) && ... ) //Check other types too
foreach (E e in Edges)
e.Target.Data = transformer(e);
else
//Do something else since not all types match
}
我收到此错误:
参数类型“E”不能分配给参数类型“TE”
即使我只是在检查它们确实是同一类型后才尝试分配。
显然我做错了什么,但我不知道会是什么。
谢谢
【问题讨论】:
-
编译器不知道在这种情况下 Edges 实际上是一个 E,所以它不会全部由你分配。您将需要转换但不能直接执行此操作,请参阅stackoverflow.com/questions/6407039/…
-
哇,一个有 5 个泛型类型参数的泛型类肯定闻起来很奇怪
-
我想补充一点,您正在寻找的是其他语言(如 C++)通过模板专业化支持的原生性。