我有以下代码:
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 :(得分: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));