首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.NET中,类可以从LambdaExpression继承吗?或者不推荐这样做?

在.NET中,类可以从LambdaExpression继承吗?或者不推荐这样做?
EN

Stack Overflow用户
提问于 2010-02-21 02:56:11
回答 4查看 1.4K关注 0票数 3

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

public class Foo : LambdaExpression { }

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

代码语言:javascript
运行
复制
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学习版)会自动为您提供以下存根:

代码语言:javascript
运行
复制
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 (这是我不能做的)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-21 03:12:02

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

在.NET 4.0中,它的行为如您所描述的那样。但是,Accept方法是internalStackSpiller类型也是如此。这再次意味着您根本不能这样做(尽管从编译器错误消息中看不出来)。值得注意的是,在.NET 4.0上,该类仍然只有internal构造函数。编译器只会找出你不能重写它的另一个原因(并且不再担心这个问题)。

编辑:关于StackSpiller类型的-它是内部的,所以你真的不需要担心它。但是,该类型看起来来自于DLR,这是一个现在处理.NET表达式(以及C# 4 dynamic)编译的lambda 4.0组件。不管怎么说,DLR是开源的,所以下面是关于这种类型的总结评论:

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

这意味着它用于在使用Compile方法编译lambda表达式时对其进行一些预处理。你可以拿到source code from CodePlex

票数 7
EN

Stack Overflow用户

发布于 2010-02-21 02:59:40

该错误消息意味着LambdaExpression本身是一个抽象类。您需要为抽象方法Accept提供主体,或者将Foo声明为抽象方法。

但是,list of LambdaExpression members on MSDN没有列出Accept

票数 4
EN

Stack Overflow用户

发布于 2010-02-21 03:01:03

这个错误基本上告诉我们LambdaExpression是一个抽象类,这意味着为了从它派生,你必须实现所有抽象成员。在本例中,是Accept方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2303261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档