2017-04-27 56 views
0

我有以下代碼:確定λ-表達的返回類型

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

我這樣稱呼它

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

我問我,如果是刪除的的定義可能性返回類型R,而應該只從表達式中獲取?

例如當我打電話

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

並且因爲接口IAgentBaseScript看起來像

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

它理論上應該是明確的,即返回類型是Vector3因爲它始終是相同的表達。

回答

0

要推斷x => x.GetInitialLocation(this)的結果類型,編譯器首先必須推斷輸入類型。正如你注意到的那樣,它無法做到。該錯誤消息建議指定Execute方法的類型參數,但足以讓編譯器知道x的類型是:

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

沒有更新Execute方法,你不能因爲C#不能確定R.

否則,您可以更新方法

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

或者

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