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