Поделиться через


Ошибка компилятора CS0831

Обновлен: Ноябрь 2007

Сообщение об ошибке

Дерево выражения не может иметь доступ к базовым членам.
An expression tree may not contain a base access.

Доступ к базовым членам подразумевает вызов функции, который обычно является вызовом виртуальной функции в качестве вызова невиртуальной функции в методе базового класса. Это действие не допускается непосредственно в дереве выражений, однако в классе можно вызвать вспомогательный метод, который, в свою очередь, вызовет метод базового класса.

Исправление данной ошибки

  • Если необходимо получить доступ к методу базового класса таким способом, создайте вспомогательный метод, вызываемый в базовом классе, и в дереве выражений вызовите этот вспомогательный метод. Этот способ показан в следующем коде.

Пример

В следующем примере возникает ошибка CS0831.

// cs0831.cs
using System;
using System.Linq;
using System.Linq.Expressions;

public class A
{
    public virtual int BaseMethod() { return 1; }
}
public class C : A
{
    public override int BaseMethod() { return 2; }
    public int Test(C c)
    {
        Expression<Func<int>> e = () => base.BaseMethod(); // CS0831

        // Try the following line instead, 
        // along with the BaseAccessHelper method.
        // Expression<Func<int>> e2 = () => BaseAccessHelper();
        return 1;
    } 
    // Uncomment to call from e2 expression above.
    // int BaseAccessHelper()
    // {
    //     return base.BaseMethod();
    // }
    
}