Error del compilador CS0831

Actualización: noviembre 2007

Mensaje de error

Un árbol de expresión no puede contener un acceso base.
An expression tree may not contain a base access.

Un acceso base significa realizar una llamada de función, que normalmente sería una llamada de función virtual, como llamada de función no virtual en el método de clase base. Esta acción no está permitida en el propio árbol de expresión, pero puede invocar un método auxiliar en la clase que invoque al método de clase base.

Para corregir este error

  • Si debe tener acceso a un método de clase base de esta forma, cree un método auxiliar que llame a la clase base y haga que el árbol de expresión llame al método auxiliar. Esta técnica se muestra en el código siguiente.

Ejemplo

El ejemplo siguiente genera el error 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();
    // }
    
}