C#中的错误:“expression式树可能不包含基本访问” – 为什么不?

我正在调用接受Expression<Func<bool>>

作为expression的一部分,我正在通过:

 this.Bottom == base.lineView.Top 

编译器给了我一个错误

expression式树可能不包含基本访问

所以我只是改变它

 this.Bottom == this.lineView.Top 

因为该会员无论如何受到保护,现在它的工作。

但是,这个错误真的让我:为什么这个base会成为一个问题? 特别是如果使用this而不是工作,但在语法上是相同的结果(相同的variables获取)?

看看System.Linq.Expressions.Expression文档,我不认为有一个expression式types代表“基本成员访问”。 不要忘记,即使在你的情况下,这意味着与此相同,在其他情况下,它不会:

 class Test { void Foo() { Expression<Func<string>> baseString = () => base.ToString(); } public override string ToString() { return "overridden value"; } } 

这里将表示对Object.ToString()this )的非虚拟调用。 我看不出如何在expression式树中表示这个错误。

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

Jon的回答是正确的。 我想跟进Jon的评论:

我可以看到,如果你可以通过编程的方式构build这个expression式,这将允许你从外部绕过正常的多态,而不是从类本身(这是正常情况)。 这可能是原因

假设你有

 public abstract class B // Prevent instantiation { internal B() {} // Prevent subclassing outside the assembly. public virtual void Dangerous() { ... } } public sealed class D : B { public override void Dangerous() { if (!Allowed()) throw whatever; base.Dangerous(); } 

D中的部分可信代码应该没有办法在D的实例上调用B.Dangerous ,而不进行D.Dangerous的安全检查。

因此,CLRvalidation程序限制您从类层次结构的外部对虚拟方法执行非虚拟调用(基本调用当然是非虚拟的)。 事实上,它甚至更远; 你甚至不能执行嵌套在D的类! (当然,如果你的程序被授予了跳过validation的权利,那么你可以做任何你想做的事情;你可以在无法validation的代码中取消引用任何指向内存的指针,这比在虚拟方法上进行静态调用要糟糕得多。

当我们deviseexpression式树时,我们不想处理这个混乱的安全问题。 最简单的做法是简单地把整件事情变成非法的。

expression树的其他一些安全问题还不是很容易解决,但那些是另一个话题。