CA2246: Nepřiřazujte symbol a jeho člena ve stejném příkazu

Vlastnost Hodnota
ID pravidla CA2246
Název Nepřiřazujte symbol a jeho člena v témže příkazu.
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Ve stejném příkazu byl přiřazen symbol a jeho člen. Příklad:

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

Popis pravidla

Přiřazení symbolu a jeho člena, tj. pole nebo vlastnosti, ve stejném příkazu se nedoporučuje. Není jasné, jestli byl přístup člena zamýšlen k použití staré hodnoty symbolu před přiřazením nebo novou hodnotou z přiřazení v tomto příkazu. Aby bylo jasné, musí být příkaz s více přiřazeními rozdělen na dva nebo více jednoduchých příkazů přiřazení.

Jak opravit porušení

Porušení opravíte tak, že příkaz s více přiřazeními rozdělíte na dva nebo více jednoduchých příkazů přiřazení. Například následující fragment kódu ukazuje porušení pravidla a několik způsobů, jak ho opravit na základě záměru uživatele:

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;'
    }
}

Kdy potlačit upozornění

Nepotlačujte porušení tohoto pravidla.

Viz také