pracuję z funkcji, które ma dwie funkcje jako parametry i zwraca nowy opanowany jeden:Dlaczego kompilator C# nie może wnioskować o delegacie typu rodzajowego z podpisu funkcji?
public static Action<T> Compose<T>(Action<T> first, Action second)
{
return new Action<T>(arg =>
{
first(arg);
second();
});
}
Zauważyłem, że kompilator narzeka jeśli nie podasz T
, wysyłając go do statyczne lub element funkcji (w przeciwieństwie do obiektu rzeczywistego 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);
}
komunikatu:
The arguments for method 'ConsoleTest.Program.Compose(System.Action, System.Action)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Moje pytanie: Dlaczego nie można wywnioskować argumentu typu? Sygnatura Test
jest znana w czasie kompilacji, nieprawdaż? Czy jest naprawdę jakaś funkcja, którą można umieścić na miejscu Test
, co spowoduje, że jej podpis będzie niejednoznaczny?
Przypis: Wiem, że mogę po prostu wysłać new Action<string>(Test)
zamiast Test
do Compose
(jak wspomniano w this question) - moje pytanie „dlaczego”, a nie „jak mogę to zrobić”.
FYI - "Komponuj' naprawia to również. –
Zobacz tę odpowiedź: http://stackoverflow.com/questions/6229131/why-cant-c-sharp-infer-type- from-this-seemingly-prosty-ow-case-case – lukegravitt
Dzięki @lukegravitt - najlepsza odpowiedź odwołuje się do specyfikacji językowej, a sam Lippert kurczy się. – McGarnagle