一个类可以继承.NET中的LambdaExpression吗?或者这不推荐?

d..*_*d.. 3 .net c# lambda inheritance

请考虑以下代码(C#4.0):

public class Foo : LambdaExpression { }

这会引发以下设计时错误:

Foo does not implement inherited abstract member
System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)
Run Code Online (Sandbox Code Playgroud)

绝对没有问题,public class Foo : Expression { }但是出于好奇和为了学习,我在谷歌搜索System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)并猜测:返回零结果(你最后一次看到的是什么时候?).不用说,我还没有在其他任何地方找到关于此方法的任何文档.

正如我所说,人们可以很容易地继承Expression; 另一方面LambdaExpression,虽然没有标记为sealed(Expression<TDelegate>从它继承),但似乎是为了防止继承它.实际情况如此吗?有没有人知道这种方法是什么?

编辑(1):基于第一个答案的更多信息 - 如果您尝试实现接受,编辑器(C#2010 Express)会自动为您提供以下存根:

protected override Expression Accept(System.Linq.Expressions.ExpressionVisitor visitor)
{
    return base.Accept(visitor);
}
Run Code Online (Sandbox Code Playgroud)

但是你仍然会得到同样的错误.如果您尝试直接使用类型的参数StackSpiller,编译器会抛出另一个错误:System.Linq.Expressions.Compiler.StackSpiller is inaccessible due to its protection level.

编辑(2):基于其他答案,继承LambdaExpression是不可能的,所以关于它是否被推荐的问题变得无关紧要.我想知道,在这种情况下,错误信息是否应该是Foo cannot implement inherited abstract member System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller) because [reasons go here]; 当前的错误消息(正如一些答案所证明的)似乎告诉我,我需要做的就是实现Accept(我不能这样做).

Tom*_*cek 7

我只是LambdaExpression使用Reflector 查看.NET 3.5中的类,该类只有一个internal构造函数.当我尝试你的代码时,我收到一个错误"类型'System.Linq.Expressions.LambdaExpression'没有定义构造函数",所以在.NET 3.5上这是不可能的(抛开它是否有用的问题)做它).

在.NET 4.0中,它的行为与您所描述的相同.但是,Accept方法是internal这样的StackSpiller类型.这再次意味着您根本无法做到这一点(虽然从编译器错误消息中不清楚).值得注意的是,该类仍然只有internal.NET 4.0上的构造函数.编译器只找到你无法覆盖它的另一个原因(并且不再担心它).

编辑:关于StackSpiller类型 - 它是内部的,所以你真的不需要担心它.但是,它看起来类型来自DLR,它是一个.NET 4.0组件,现在处理lambda表达式(以及C#4 dynamic)的编译.无论如何,DLR是开源的,所以这里是关于这种类型的摘要评论:

表达式重写将CLR堆栈溢出到临时变量中以保证代码生成的某些属性,例如我们总是在空堆栈上输入try块.

这意味着它在用于使用该Compile方法编译时用于对lambda表达式进行一些预处理.您可以从CodePlex获取源代码.