【发布时间】:2011-08-24 17:07:44
【问题描述】:
考虑两种方法:
public static IEnumerable<V> Merge<V>
(this IEnumerable<IEnumerable<V>> coll)
public static IEnumerable<V> Merge<T, V>
(this IEnumerable<T> coll)
where T : IEnumerable<V>
两者都编译得很好,在这两种情况下,泛型类型的类型将在调用者的编译时知道,因此扩展类型的确切类型。
你可以同时调用两个,但只能将第一个作为扩展名。
为什么?
更新 1
要失败,请使用第二种方法和这样的例子:
var x = new List<List<int>>();
var y = x.Merge();
更新 -- 关闭
你们不觉得原帖太详细了,看不清楚吗?出于教育目的,我认为不应关闭此帖子,即使在技术上(即答案)它是重复的。只是我的 2 美分。
【问题讨论】:
-
啊,我明白了,所以当你说使用第二种方法时,你说的是第二种方法本身。并不是说这两者都是彼此的重载……对吧?
-
在这种情况下,Eric 提到的 SO 回答才是真正的原因。因为 T 和 V 之间的关系是在约束中指定的,并且编译器不会从约束中推断类型,所以编译器不知道如何解析你的泛型类型参数 V,这就是为什么你必须显式指定类型参数 V。跨度>
-
@James Michael Hare,不知何故,我错过了必须解决模板参数的部分,而不仅仅是方法;-) 现在编译器很容易理解(但是,如果可以使用约束,它会有所帮助方法定义的一部分)。
标签: c# generics extension-methods constraints