我一直玩的泛型和代表和我發現了一些我不明白的東西。我有非常相似的一般靜態方法,一個接受Action<T>
,第二個接受Func<T>
。現在的問題是:如果我打電話給接受Func<T>
沒有顯式類型的人,那麼編譯器就可以。但是,接受Action<T>
的程序無法編譯(請參閱錯誤消息的代碼)。從動作<T>類型參數不能推斷,但從功能<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中.NET 4.5 2012
[爲什麼C#編譯器不能從函數簽名中推斷泛型類型委託?](http://stackoverflow.com/questions/19015283/why-cant-c-sharp-compiler-infer-generic- type-delegate-from-function-signature) –