我找不到内联表达式变量的代码

时间:2014-05-18 12:23:48

标签: c# roslyn

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中阻止错误的地方。

任何想法?

1 个答案:

答案 0 :(得分:7)

你正在寻找错误的东西。请记住,编译器不一定以与他们自己使用的相同的运行时版本为目标。如果它有意义(它没有),它甚至可能被编写为完全不受管理的C ++,但仍然可以生成可验证的.NET可执行文件。因此,如果Roslyn实际上直接使用System.Linq.Expressions.Expression<T>类型,它只会在内部使用,它不会被复制到任何输出程序集中。相反,它的作用是按名称查找所需的运行时类型。

在这里搜索是一件好事,因为你已经看过它,并且你可以猜到它不会给出许多误报,是ParameterExpression,其中有只会产生两个属于C#编译器的文件:Src/Compilers/CSharp/Source/Lowering/LambdaRewriter/ExpressionLambdaRewriter.csSrc/Compilers/Core/Source/WellKnownTypes.cs。前者就是你想要的那个。