C# 打印传递给Func对象的lambda

C# 打印传递给Func对象的lambda,c#,lambda,expression,C#,Lambda,Expression,我可以像这样打印一个lambda表达式 Expression<Func<double,double>> expr = x => x * x; string s = expr.ToString(); // "x => (x * x)" 表达式expr=x=>x*x; 字符串s=expr.ToString();//“x=>(x*x)” 然而如果 Func<double, double> function = x =>

我可以像这样打印一个lambda表达式

Expression<Func<double,double>> expr = x => x * x; 
string s = expr.ToString(); // "x => (x * x)" 
表达式expr=x=>x*x; 字符串s=expr.ToString();//“x=>(x*x)” 然而如果

Func<double, double> function = x => x * x;
Func function=x=>x*x;
那么如何生成
表达式
以产生相同的结果?表达式构造函数是内部的,Func类型和它们的表达式之间没有隐式转换。

您不能

当你写作时:

Expression<Action<int>> e = x => Console.WriteLine(x);
Action<int> a = x => Console.WriteLine(x);
表达式。

你不能

当你写作时:

Expression<Action<int>> e = x => Console.WriteLine(x);
Action<int> a = x => Console.WriteLine(x);

表达式。

你不能。当您执行
Expression expr=x=>…
时,C#编译器会发出代码,在运行时构造该表达式树。当您执行
Func f=x=>…
时,编译器会发出代码,实际执行您要求的操作,并丢弃创建表达式所需的所有信息。请问您为什么要这样做?这是某种调试支持吗?@Neil:我认为在单元测试微积分模块时,能够向单元测试资源管理器显示输入(由lambda初始化的Func参数)的数学表达式(或最接近的东西)是很好的。为了更容易地区分NUnit测试用例(NUnit just.ToString测试用例名称中的参数,当您使用TestCase属性时)。您不能。当您执行
Expression expr=x=>…
时,C#编译器会发出代码,在运行时构造该表达式树。当您执行
Func f=x=>…
时,编译器会发出代码,实际执行您要求的操作,并丢弃创建表达式所需的所有信息。请问您为什么要这样做?这是某种调试支持吗?@Neil:我认为在单元测试微积分模块时,能够向单元测试资源管理器显示输入(由lambda初始化的Func参数)的数学表达式(或最接近的东西)是很好的。为了更容易地区分NUnit测试用例(NUnit just.ToString测试用例名称中的参数,当您使用TestCase属性时)。非常感谢,超级清晰的答案。非常感谢,超级清晰的答案。