2017-04-27 156 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?