c# - .NET 中的类可以继承自 LambdaExpression 吗?还是不推荐这样做?

标签 c# .net inheritance lambda

考虑以下代码 (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 { }绝对没问题但是,出于好奇和学习,我在 Google 中搜索了 System.Linq.Expressions.LambdaExpression.Accept(System.Linq.Expressions.Compiler.StackSpiller)你猜怎么着:返回零结果(你最后一次看到它是什么时候?)。不用说,我在其他任何地方都找不到关于此方法的任何文档。

正如我所说,可以轻松地从 Expression 继承;另一方面LambdaExpression ,虽然未标记为 sealed ( Expression<TDelegate> 继承自它),似乎旨在防止继承自它。事实真的如此吗?有谁知道这个方法是关于什么的?

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

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 (我做不到)。

最佳答案

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

在 .NET 4.0 中,它的行为与您描述的一样。但是,Accept 方法是内部的StackSpiller 类型也是。这再次意味着您根本无法执行此操作(尽管编译器错误消息中并不清楚)。值得注意的是,该类在 .NET 4.0 上仍然只有 internal 构造函数。编译器只会找到您无法覆盖它的另一个原因(并且不再担心)。

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

Expression rewriting to spill the CLR stack into temporary variables in order to guarantee some properties of code generation, for example that we always enter try block on empty stack.

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

关于c# - .NET 中的类可以继承自 LambdaExpression 吗?还是不推荐这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2303261/

相关文章:

scala - 如何在 Scala 中的案例类上共享行为

java - 具有继承功能的枚举

c# - 解释这个 LINQ 代码?

c# - WPF Visual Studio 调试 - 控制台

c# - 在 ASP.NET Core MVC 中获取主机地址

.net - 使用 Entity Framework 频繁保存

c# - .Net ThreadPool 线程是如何创建的?

c# - 从对象列表返回属性列表

c# - Razor View 如果句子不起作用

java - 访问父类(super class)的私有(private)成员