Errore del compilatore CS0831

Aggiornamento: novembre 2007

Messaggio di errore

Una struttura ad albero dell'espressione non può contenere un accesso di base.
An expression tree may not contain a base access.

Un accesso di base indica una chiamata di funzione che normalmente sarebbe una chiamata di funzione virtuale come chiamata di funzione non virtuale sul metodo della classe base. Ciò non è consentito nella struttura ad albero dell'espressione, ma è possibile richiamare un metodo di supporto nella classe che richiama il metodo della classe base.

Per correggere l'errore

  • Se è necessario accedere a un metodo della classe base in questo modo, creare un metodo di supporto che chiami nella classe base e che venga chiamato dalla struttura ad albero dell'espressione. Questa tecnica viene illustrata nel codice riportato di seguito.

Esempio

Nell'esempio seguente viene generato l'errore 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();
    // }
    
}