CA2246: Non assegnare un simbolo e il relativo membro nella stessa istruzione

Proprietà valore
ID regola CA2246
Title Non assegnare un simbolo e il relativo membro nella stessa istruzione
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Nella stessa istruzione è stato assegnato un simbolo e il relativo membro. Ad esempio:

// 'a' and 'a.Field' are assigned in the same statement
a.Field = a = b;

Descrizione regola

Non è consigliabile assegnare un simbolo e il relativo membro, ovvero un campo o una proprietà, nella stessa istruzione. Non è chiaro se l'accesso al membro è stato progettato per usare il valore precedente del simbolo prima dell'assegnazione o il nuovo valore dell'assegnazione in questa istruzione. Per maggiore chiarezza, l'istruzione multi-assign deve essere suddivisa in due o più istruzioni di assegnazione semplici.

Come correggere le violazioni

Per correggere le violazioni, suddividere l'istruzione multi-assign in due o più istruzioni di assegnazione semplici. Ad esempio, il frammento di codice seguente mostra una violazione della regola e un paio di modi per correggerlo in base alla finalità dell'utente:

public class C
{
    public C Field;
}

public class Test
{
    public void M(C a, C b)
    {
        // Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
        // It is not clear if the user intent in the below statement is to assign to 'Instance1.Field' or 'Instance2.Field'.
        // CA2246: Symbol 'a' and its member 'Field' are both assigned in the same statement. You are at risk of assigning the member of an unintended object.
        a.Field = a = b;
    }
}
public class C
{
    public C Field;
}

public class Test
{
    public void M(C a, C b)
    {
        // Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
        // 'Instance1.Field' is intended to be assigned.
        var instance1 = a;
        a = b;
        instance1.Field = a;
    }
}
public class C
{
    public C Field;
}

public class Test
{
    public void M(C a, C b)
    {
        // Let us assume 'a' points to 'Instance1' and 'b' points to 'Instance2' at the start of the method.
        // 'Instance2.Field' is intended to be assigned.
        a = b;
        b.Field = a; // or 'a.Field = a;'
    }
}

Quando eliminare gli avvisi

Non eliminare le violazioni da questa regola.

Vedi anche