【发布时间】:2014-03-26 18:28:56
【问题描述】:
我一直在玩一些泛型和委托,但我发现了一些我不理解的东西。我有非常相似的通用静态方法,一个接受Action<T>,第二个接受Func<T>。现在的问题是:如果我在没有明确类型的情况下调用接受Func<T> 的那个,编译器就可以了。但是如果接受Action<T>,我的程序将无法编译(请参阅错误消息代码)。
我的问题是:为什么编译器能识别返回类型,却不能识别参数类型?
public interface IMessage
{ }
public class Message : IMessage
{
}
static void HandleAction<TMessage>(Action<TMessage> action)
where TMessage : IMessage
{ }
static void HandleFunction<TMessage>(Func<TMessage> 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<TMessage>(System.Action<TMessage>)'
// cannot be inferred from the usage.
//Try specifying the type arguments explicitly.
//HandleAction(A);
// this one is ok
HandleAction<Message>(A);
}
我在 Visual Studio 2012 中使用 .NET 4.5。
【问题讨论】: