我正在使用一个函数,该函数将两个函数作为参数,并返回一个新的组合函数:
public static Action<T> Compose<T>(Action<T> first, Action second)
{
return new Action<T>(arg =>
{
first(arg);
second();
});
}
我注意到,如果我没有指定T
,编译器会在向它发送静态或成员函数(而不是实际Action<T>
对象)时抱怨:
static void Main(string[] args)
{
// compiler error here
var composed = Compose(Test, () => Console.WriteLine(" world"));
composed("hello");
Console.ReadLine();
}
public static void Test(string arg)
{
Console.Write(arg);
}
错误信息:
无法从用法中推断出方法“ConsoleTest.Program.Compose(System.Action, System.Action)”的参数。尝试明确指定类型参数。
我的问题:为什么不能在这里推断类型参数?的签名Test
在编译时是已知的,不是吗?真的有一些功能可以代替Test
,这会导致其签名不明确吗?
脚注:我知道我可以简单地发送new Action<string>(Test)
而不是发送Test
到Compose
(如本问题所述)——我的问题是“为什么”,而不是“我该怎么做”。