Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#表达式中设置参数_C#_.net_Linq Expressions - Fatal编程技术网

如何在C#表达式中设置参数

如何在C#表达式中设置参数,c#,.net,linq-expressions,C#,.net,Linq Expressions,我不熟悉c#中的表达式API。假设我有两个双参数x和y的表达式。我想把这个表达式包装成另一个表达式,在这里我可以传递一个双数组而不是两个参数。我尝试了以下方法(我正在用F#测试它,因此是语法) 我认为表达式基本上是一个函数体(这可能是错误的!)。因此,我们不使用Foo(double x,double y),而是使用一个输入表达式(我们称之为Foo_表达式),我知道它有两个参数。我想将这个表达式包装在另一个表达式中(与上面的WrappedFoo等效),这样新的表达式将接受一个双数组参数,然后分发这

我不熟悉c#中的表达式API。假设我有两个双参数x和y的表达式。我想把这个表达式包装成另一个表达式,在这里我可以传递一个双数组而不是两个参数。我尝试了以下方法(我正在用F#测试它,因此是语法)


我认为表达式基本上是一个函数体(这可能是错误的!)。因此,我们不使用Foo(double x,double y),而是使用一个输入表达式(我们称之为Foo_表达式),我知道它有两个参数。我想将这个表达式包装在另一个表达式中(与上面的WrappedFoo等效),这样新的表达式将接受一个双数组参数,然后分发这些参数以调用Foo_表达式。我不确定我是否可以用表达式来实现这一点。

参数
x
y
在您以前的lambda中编译,并且不会传递到第二个
表达式中。lambda
调用,但您似乎并不希望这样,因为这样您就有了一个带有方法签名的表达式,如
method(double[],double,double)
。您可能希望将另一个
x2
y2
定义为局部变量,然后将其作为参数传递给第一个编译的lambda

我还不是100%清楚你想要实现什么,如果你澄清一下,我可能会进一步提供帮助。有时,它可以帮助我写出函数的行为,然后将它们转换为表达式。

就像在普通C#代码中一样,必须声明表达式中的变量。在中,第一个参数列出了声明的变量。因此,您声明的是
result
,而不是
x
y

它在第一个版本中工作,因为
x
y
是参数,而不是局部变量

因此,解决办法是:

let block = Expression.Block( [| x; y; result |], blockStatements )
这是可行的,但主要是偶然的。您不会说
result
是应该返回的值,实际返回的值是最后一个表达式的值(
expression
s在这方面更像F而不是C)

因此,带有修复的代码将等效于:

double WrappedFoo(double[] inputs)
{
    double x;
    double y;
    double result;

    x = inputs[0];
    y = inputs[1];
    return (result = Foo(x, y));
}
要获得更像您描述的代码,请去掉
result
变量,并将最后一条语句更改为您想要返回的表达式:

blockStatements.Add(givenExpr)

我使用F#只是为了测试。我打算用C语言实现。我应该把标题改成.NET而不是C。抱歉。为什么不
double WrappedFoo(double[]args){return Foo(args[0],args[1]);}
?对于像这样简单的事情,你真的不需要变量。这很有效!非常感谢你!我发现这有点违反直觉,因为在上面的常规C#代码中,变量名显然不必与参数名匹配,而表达式版本是按名称将局部变量与givenExpr的参数匹配。无论如何,很高兴它能工作@我不明白你在说什么。在
Expression
s中,参数和变量从不按名称匹配,而是按
ParameterExpression
对象的引用进行匹配。
double WrappedFoo(double[] inputs)
{
    double x;
    double y;
    double result;

    x = inputs[0];
    y = inputs[1];
    return (result = Foo(x, y));
}
blockStatements.Add(givenExpr)