C#编译器转换它(例如):
Expression<Action> e = () =>Console.WriteLine();
Run Code Online (Sandbox Code Playgroud)
成:
Expression<Action> expression =
Expression.Lambda<Action>(
Expression.Call(null,
(MethodInfo) methodof(Console.WriteLine),
new Expression[0]),
new ParameterExpression[0]);
Run Code Online (Sandbox Code Playgroud)
我System.Linq.Expression<T>在源代码中找不到任何引用.
我的想法是,使C#支持多语句lambda可能很简单.我只找到了设计时间代码分析在lambdas中阻止错误的地方.
任何想法?
小智 7
你在寻找错误的东西.请记住,编译器不一定以与它们自己使用的相同的运行时版本为目标.如果它有意义(它没有),甚至可能将Roslyn写成完全不受管理的C++,但仍然可以生成可验证的.NET可执行文件.因此,如果Roslyn实际上System.Linq.Expressions.Expression<T>直接使用了类型,它只会在内部使用,它不会被复制到任何输出程序集中.相反,它的作用是按名称查找所需的运行时类型.
在这里搜索是一件好事,因为你已经看过它已被使用,并且你可以猜测它不会产生很多误报,是ParameterExpression,只有两个文件中的结果是C#编译器的一部分:Src/Compilers/CSharp/Source/Lowering/LambdaRewriter/ExpressionLambdaRewriter.cs和Src/Compilers/Core/Source/WellKnownTypes.cs.前者是你想要的.