无法推断出Action 中的type参数,但是从Func 可以得到

我一直在玩仿制药和代表,我发现了一些我不理解的东西。 我有非常相似的通用静态方法,一个接受Action ,第二个接受Func 。 现在的问题是:如果我在没有显式类型的情况下调用接受Func那个,编译器就可以了。 但是接受Action无法编译我的程序(请参阅错误消息的代码)。

我的问题是:为什么编译器能够识别返回类型,但是无法识别参数类型?

 public interface IMessage { } public class Message : IMessage { } 
 static void HandleAction(Action action) where TMessage : IMessage { } static void HandleFunction(Func action) where TMessage : IMessage { } static void A(Message message) { } static Message F() { return new Message(); } static void Main(string[] args) { // this one is ok HandleFunction(F); // compiler error: // The type arguments for method // 'template_test.Program.HandleAction(System.Action)' // cannot be inferred from the usage. //Try specifying the type arguments explicitly. //HandleAction(A); // this one is ok HandleAction(A); } 

我在Visual Studio 2012中使用.NET 4.5。

方法可以通过其参数重载,并且所有重载形成一个方法组 ,因此例如void Xyz(int i)void Xyz(string s)在称为Xyz相同方法组内。 即使用户只定义了一个方法,编译器也无法推断出一种类型的参数,因为编译器的行为非常严格。

返回类型不能重载方法,因此不能在同一个类中使用int Xyz()string Xyz() 。 返回类型可以很容易地被编译器扣除,因为没有重载。

这对我来说第一次并不明显,但在我意识到我可以创造一个过载之后就已经很清楚了。