我正在调用一个接受的方法Expression<Func<bool>>
.
作为我传递的表达式的一部分:
this.Bottom == base.lineView.Top
编译器给了我一个错误
表达式树可能不包含基本访问
所以我简单地将其更改为
this.Bottom == this.lineView.Top
因为该成员无论如何都受到保护,现在它可以工作了。
但这个错误确实让我困惑:到底为什么会这样base
有问题吗?特别是如果使用this
相反会起作用,但语法上是相同的结果(访问相同的变量)?
看着System.Linq.Expressions.Expression http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression%28v=vs.110%29.aspx文档中,我认为没有表示“基本成员访问”的表达式类型。不要忘记,即使在你的情况下它的含义与只是相同this
,在其他情况下它不会:
class Test
{
void Foo()
{
Expression<Func<string>> baseString = () => base.ToString();
}
public override string ToString()
{
return "overridden value";
}
}
这里代表一个非虚拟调用Object.ToString()
(for this
)。我看不到它如何在表达式树中表示,因此出现错误。
现在这就引出了一个明显的问题why表达式树中没有非虚拟基成员调用的表示 - 恐怕我无法回答这部分......尽管我可以看到如果你could以编程方式构建该表达式,这将允许您绕过正常的多态性从外部而不仅仅是从类本身内部(这是正常情况)。也许就是这个原因。 (诚然,还有其他非虚拟调用方法的方法,但这是另一回事,我敢说在某些情况下表达式树是“可信的”,但其他代码不是。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)