Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定Lambda表达式的返回类型_C#_Lambda - Fatal编程技术网

C# 确定Lambda表达式的返回类型

C# 确定Lambda表达式的返回类型,c#,lambda,C#,Lambda,我有以下代码: public class ScriptRuntime { public R Execute<T, R>(Expression<Func<T, R>> expression) { // ... do something ... return default(R); } } 因为接口IAgentBaseScript看起来像 public interface IAgentBaseScript {

我有以下代码:

public class ScriptRuntime {
    public R Execute<T, R>(Expression<Func<T, R>> expression) {
        // ... do something ...
        return default(R);
    }
}
因为接口
IAgentBaseScript
看起来像

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

理论上应该很清楚,returntype是Vector3,因为它总是与表达式相同。

如果没有update Execute方法,就不能,因为C不能确定R

或者,您可以将该方法更新为

public Vector3? Execute<T>(Expression<Func<T, Vector3>> expression)
公共向量3?执行(表达式)

public R Execute(表达式)其中R:Vector3?

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

scriptRuntime.Execute((IAgentBaseScript x) => x.GetInitialLocation(this));
public Vector3? Execute<T>(Expression<Func<T, Vector3>> expression)
public R Execute<T, R>(Expression<Func<T, R>> expression) where R : Vector3? 
scriptRuntime.Execute((IAgentBaseScript x) => x.GetInitialLocation(this));