考虑以下代码(C# 4.0):
public class Foo : LambdaExpression { }
这将引发以下设计时错误:
Foo does not implement inherited abstract member
System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)public class Foo : Expression { }绝对没有问题,但出于好奇心和学习的需要,我在谷歌System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)中搜索了一下,你猜结果是什么?(你上次看到它是什么时候?)不用说,我在其他任何地方都没有找到任何关于此方法的文档。
正如我所说的,可以很容易地继承Expression;另一方面,LambdaExpression虽然没有被标记为sealed (Expression<TDelegate>继承自它),但似乎被设计成阻止继承它。真的是这样吗?有没有人知道这个方法是怎么回事?
编辑(1):基于第一个答案的更多信息-如果您尝试实现Accept,编辑器(C# 2010学习版)会自动为您提供以下存根:
protected override Expression Accept(System.Linq.Expressions.ExpressionVisitor visitor)
{
return base.Accept(visitor);
}但是你仍然会得到同样的错误。如果您尝试直接使用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 (这是我不能做的)。
发布于 2010-02-21 03:12:02
我刚刚使用Reflector查看了.NET 3.5中的LambdaExpression类,该类只有一个internal构造函数。当我尝试你的代码时,我得到了一个错误“类型'System.Linq.Expressions. LambdaExpression‘没有定义构造函数”,所以在.NET 3.5上不能这样做(抛开这样做是否有用的问题不谈)。
在.NET 4.0中,它的行为如您所描述的那样。但是,Accept方法是internal,StackSpiller类型也是如此。这再次意味着您根本不能这样做(尽管从编译器错误消息中看不出来)。值得注意的是,在.NET 4.0上,该类仍然只有internal构造函数。编译器只会找出你不能重写它的另一个原因(并且不再担心这个问题)。
编辑:关于StackSpiller类型的-它是内部的,所以你真的不需要担心它。但是,该类型看起来来自于DLR,这是一个现在处理.NET表达式(以及C# 4 dynamic)编译的lambda 4.0组件。不管怎么说,DLR是开源的,所以下面是关于这种类型的总结评论:
表达式重写,将CLR堆栈溢出到临时变量中,以保证代码生成的一些属性,例如,我们总是在空堆栈上输入try block。
这意味着它用于在使用Compile方法编译lambda表达式时对其进行一些预处理。你可以拿到source code from CodePlex。
发布于 2010-02-21 02:59:40
该错误消息意味着LambdaExpression本身是一个抽象类。您需要为抽象方法Accept提供主体,或者将Foo声明为抽象方法。
但是,list of LambdaExpression members on MSDN没有列出Accept。
发布于 2010-02-21 03:01:03
这个错误基本上告诉我们LambdaExpression是一个抽象类,这意味着为了从它派生,你必须实现所有抽象成员。在本例中,是Accept方法。
https://stackoverflow.com/questions/2303261
复制相似问题