Lire en anglais

Partager via


Erreur du compilateur CS8170

Les membres struct ne peuvent pas retourner « this » ou d'autres membres d'instance par référence

Exemple

L’exemple suivant génère l’avertissement CS8170 :

Les types de valeur (c’est-à-dire struct) sont généralement alloués sur la pile. Un type de valeur alloué sur la pile devient non valide, quittant l’étendue dans laquelle il a été déclaré. Le compilateur évite une référence à une variable qui devient non valide en quittant l’étendue en générant cette erreur.

// CS8170.cs (8,14)

struct Program
{
    public int d;

    public ref int M()
    {
        return ref d;
    }
}

public class Other
{
    public void Method()
    {
        var p = new Program();
        var d = p.M();
    }
}

Pour corriger cette erreur

La modification de la méthode en une autre valeur que retour ref corrige cette erreur :

delegate void D();

struct Program
{
    public event D d;

    public D M()
    {
        return d;
    }
}

Si une référence à un membre est requise, envisagez d’étendre l’étendue de la valeur. Par exemple :

public struct Program
{
    public int d;
}

public static class Extensions
{
    public static ref readonly int RefD(this in Program program)
    {
        return ref program.d;
    }
}

public class Other
{
    public void Method()
    {
        var p = new Program();
        var d = p.RefD();
    }
}