Error in C#: “an expression tree may not contain a base access” - why not?

后端 未结 2 1039
眼角桃花
眼角桃花 2021-02-01 01:46

I was calling a method that accepts Expression>.

As part of the expression I was passing:

this.Bottom == base.lineVie         


        
2条回答
  •  梦谈多话
    2021-02-01 02:22

    Looking at the System.Linq.Expressions.Expression documentation, I don't think there's an expression type which represents "base member access". Don't forget that even though in your case it meant the same as just this, in other cases it wouldn't:

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

    Here that would represent a non-virtual call to Object.ToString() (for this). I can't see how that would be represented in an expression tree, hence the error.

    Now that leads on to the obvious question of why there isn't a representation of non-virtual base member invocation in expression trees - I'm afraid I can't answer that part... although I can see that if you could build that expression programmatically, that would allow you to bypass normal polymorphism from the outside instead of only from inside the class itself (which is the normal case). That may be the reason. (Admittedly there are other ways of calling methods non-virtually, but that's a different matter, and I dare say there are situations where expression trees are "trusted" but other code isn't.)

提交回复
热议问题