c# - C# : "an expression tree may not contain a base access" - why not? 错误

标签 c# .net expression-trees

我正在调用一个接受 Expression<Func<bool>> 的方法.

作为我传递的表达式的一部分:

this.Bottom == base.lineView.Top

编译器给我一个错误

an expression tree may not contain a base access

所以我干脆改成了

this.Bottom == this.lineView.Top

因为该成员无论如何都受到了保护,现在可以使用了。

但是这个错误真的让我很困惑:为什么这个 base有问题吗?特别是如果使用 this相反会工作但语法上是相同的结果(访问相同的变量)?

最佳答案

查看 System.Linq.Expressions.Expression文档,我认为没有表示“基本成员访问”的表达式类型。不要忘记,即使在您的情况下它与 this 的含义相同,但在其他情况下它不会:

class Test
{
    void Foo()
    {
        Expression<Func<string>> baseString = () => base.ToString();
    }

    public override string ToString()
    {
        return "overridden value";
    }
}

这里表示对 Object.ToString() 的非虚拟调用(对于 this)。我看不到这将如何在表达式树中表示,因此出现错误。

现在引出了一个明显的问题,即为什么表达式树中没有非虚拟基础成员调用的表示 - 恐怕我无法回答那部分。 .虽然我可以看到,如果您可以以编程方式构建该表达式,那将允许您从外部而不是仅从类本身内部绕过正常的多态性(这是正常情况)。这可能是原因。 (不可否认,还有其他非虚拟调用方法的方法,但那是另一回事,我敢说在某些情况下,表达式树是“可信的”,但其他代码不是。)

关于c# - C# : "an expression tree may not contain a base access" - why not? 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22274120/

相关文章:

c# - 使用C#进行用户代理解析

c# - 通过c#中的过程和接口(interface)统计mysql表中的行数

c# - 如何在列具有单元格模板的情况下以编程方式创建 GridView?

.net - 代码契约和编译

c# - 获取一周第一个星期一的日期?

c# - 可访问 'this' 的非静态表达式<Func<X>>

c# - 如何使用 Entity Framework SqlQuery 保护 SQL 参数?

c# - ContextMenuStrip 在指定控件上方绘制不当

c - 使用堆栈和二叉树c构建表达式树

.net - 从一个重要的 IQueryable 编译 Linq 到 SQL 查询