2017-04-27 3 views
0

Ich habe folgenden Code:Bestimmen Rückgabetyp von Lambda-Expression

public class ScriptRuntime { 
    public R Execute<T, R>(Expression<Func<T, R>> expression) { 
     // ... do something ... 
     return default(R); 
    } 
} 

Ich nenne es wie

var loc = AddIn.Context.ScriptRuntime.Execute<IAgentBaseScript, Vector3?>(x => x.GetInitialLocation(this)); 

ich mich bin zu fragen, ob es wäre eine Möglichkeit das Definieren der entfernen returntype R und stattdessen sollte es nur aus dem Ausdruck bekommen?

Zum Beispiel, wenn ich

var loc = AddIn.Context.ScriptRuntime.Execute<IAgentBaseScript>(x => x.GetInitialLocation(this)); 

und weil die Schnittstelle nennen IAgentBaseScript wie

public interface IAgentBaseScript { 
    Place GetInitialPlace(AgentBase agent); 
    Vector3? GetInitialLocation(AgentBase agent); 
} 

es sollte theoretisch klar sein, dass der Rückgabetyp ist Vector3 aussieht, weil es immer der gleiche wie der Ausdruck ist .

Antwort

0

aktualisieren, um Wenn Sie den Ergebnistyp x => x.GetInitialLocation(this) ableiten, müsste der Compiler zuerst auf den Eingabetyp schließen. Wie Sie bemerkt haben, ist es nicht möglich. Die Fehlermeldung schlägt die Typargumente von Execute Methode, um anzugeben, aber es ist genug, um die Compiler zu informieren, was die Art der x ist:

scriptRuntime.Execute((IAgentBaseScript x) => x.GetInitialLocation(this)); 
0

Ohne Update Execute-Methode können Sie nicht, weil C# kann R. nicht bestimmen

Oder können Sie die Methode

public Vector3? Execute<T>(Expression<Func<T, Vector3>> expression) 

Oder

public R Execute<T, R>(Expression<Func<T, R>> expression) where R : Vector3?