确定Lambda-Expression的返回类型

时间:2017-04-27 13:00:25

标签: c# lambda

我有以下代码:

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,因为它总是与表达式相同。

2 个答案:

答案 0 :(得分:0)

没有更新执行方法,你不能因为C#无法确定R.

否则,您可以将方法更新为

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

或者

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

答案 1 :(得分:0)

要推断x => x.GetInitialLocation(this)的结果类型,编译器首先必须推断输入类型。正如你所注意到的,它无法做到。错误消息建议指定Execute方法的类型参数,但这足以让编译器知道x的类型:

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