Ошибка компилятора 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();
// }
}