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树的其他一些安全问题还不是很容易解决,但那些是另一个话题。