Läs på engelska

Dela via


Kompilatorfel CS8170

Struct-medlemmar kan inte returnera "detta" eller andra instansmedlemmar med referens

Exempel

Följande exempel genererar CS8170:

Värdetyper (dvs. structs) allokeras oftast i stacken. En värdetyp som allokerats i stacken blir ogiltig och lämnar omfånget där den deklarerades. Kompilatorn undviker en referens till en variabel som blir ogiltig och lämnar omfånget genom att generera det här felet.

// 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();
    }
}

Så här åtgärdar du det här felet

Om du ändrar metoden till inte ref-return korrigeras det här felet:

delegate void D();

struct Program
{
    public event D d;

    public D M()
    {
        return d;
    }
}

Om en referens till en medlem krävs kan du överväga att utöka värdets omfång. Till exempel:

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();
    }
}