私はパラメータとして二つの機能を取り、新しい合成1を返す関数で働いている:私はそれ送信するときに、私は、T
を指定しない場合、コンパイラは文句を言いことに気付きましたC#コンパイラが汎用シグネチャの代理人を推論できないのはなぜですか?
public static Action<T> Compose<T>(Action<T> first, Action second)
{
return new Action<T>(arg =>
{
first(arg);
second();
});
}
静的またはメンバ関数(実際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);
}
エラーメッセージ:
The arguments for method 'ConsoleTest.Program.Compose(System.Action, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
私の質問:なぜ型引数はここで推論できないのですか? Test
の署名はコンパイル時にはわかりますか? Test
の代わりに置くことができる機能がありますか?それはその署名があいまいになる原因になりますか?
脚注:私は(this questionに述べたように)私は単にCompose
にnew Action<string>(Test)
代わりのTest
を送ることができます知っている - 私の質問は、「なぜ」、「どのように私はこれを行うことができます」ではありません。
FYI - 'Compose 'も同様です。 –
この回答を参照してください:http://stackoverflow.com/questions/6229131/why-cant-c-sharp-infer-type-from-this-seemingly-simple-obvious-case – lukegravitt
ありがとう@lukegravitt - そこのトップの答え言語スペックを参照し、Lippert自身がチャイムインします。 – McGarnagle