2016-03-15 12 views
12

Ich versuche, eine generische Methode zu schreiben, die Parameter und ruft eine Funktion, wie diese liefert:C# Methodengruppe Typinferenz

class MyClass { 
    public int Method(float arg) => 0; 
} 

TResult Call<T1, TResult>(Func<T1, TResult> func) => 
    func(default(T1)); 

void Main() 
{ 
    var m = new MyClass(); 
    var r1 = Call<float, int>(m.Method); 
    var r2 = Call(m.Method); // CS0411 
} 

Die letzte Zeile nicht kompilieren mit CS0411. Gibt es eine Problemumgehung, um Typrückschluss zu erhalten, um hier zu arbeiten?

Anwendungsfall: Verwenden von AutoFixture zum Generieren von Funktionsaufrufparametern.

+0

Ich glaube nicht, dass das möglich ist. – mrahhal

+0

Related (?): Http://Stackoverflow.com/a/9331879/3225495 –

+0

Es ist nicht verwandt, in seinem Fall sind die beiden Typen unabhängig und beide durch die Methode Handle gegeben. C# könnte theoretisch die korrekten generischen Argumente vollständig ableiten. Der Standard erfordert dies aus Gründen der Komplexität nicht. – Blindy

Antwort

6

Leider nein, das ist eine Einschränkung der Typinferenz in C#. Es macht nicht viel mit Rückgabetypen, was in Ihrem Fall erforderlich ist, um die generischen Argumente zu Call<> vollständig abzuleiten.

Verwandte Themen