我正在调用一个接受 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/