为什么带约束的generics扩展方法不被识别为扩展方法?

可能重复:
没有使用generics扩展方法的类型推断

考虑两种方法:

public static IEnumerable Merge (this IEnumerable<IEnumerable> coll) public static IEnumerable Merge (this IEnumerable coll) where T : IEnumerable 

两者都编译得很好,在这两种情况下,generics类型的类型将在调用者的编译时知道,因此是扩展类型的确切类型。

你可以调用两个,但只有第一个作为扩展名。

为什么?

更新1

要查看它失败,请使用第二种方法,例如:

  var x = new List<List>(); var y = x.Merge(); 

更新 – 关闭

难道你们不认为原帖是太精心设计得到清晰的画面吗? 出于教育目的,我认为这篇文章不应该被关闭,即使技术上(即答案)是重复的。 只需2美分。

在进行推断时,方法类型推断不会将约束考虑在内。

昨天也问了同样的问题。 有关详细信息,请参阅我的答案。

没有使用generics扩展方法的类型推断

我不认为问题是第二个不能被调用,但智能感知不会看到它,因为它无法在没有明确帮助的情况下从您的调用中轻易推断出第二个generics类型参数V

例如,给定两种扩展方法,以下都是合法的

  // IEnumerable> definition... List> x = ...; // calls your first method (implicitly) x.Merge(); // also calls your first method (explicitly) x.Merge(); // calls your second method (explicitly) x.Merge, int>(); 

所有这三个都成功编译,我只想到两个generics类型参数,它不能从使用中推断出你的第二个generics类型参数,因此它没有在intellisense中显示,但仍然合法……

更新 :根据提问者的说法,并不是两个方法都被声明为重载,而是它们是/或。 鉴于原因Merge()在第二种forms上不起作用,因为T和V之间的关系在类型约束中定义,因此不像Eric在他的SO答案中所说的那样用于类型推断。