CA2246: No asignar un símbolo y su miembro en la misma instrucción

Propiedad Value
Identificador de la regla CA2246
Título No asignar un símbolo y su miembro en la misma instrucción
Categoría Uso
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como sugerencia

Causa

Un símbolo y su miembro se asignaron en la misma instrucción. Por ejemplo:

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

Descripción de la regla

No se recomienda asignar un símbolo y su miembro, es decir, un campo o una propiedad, en la misma instrucción. No está claro si el acceso a miembros debía usar el valor anterior del símbolo antes de la asignación o el nuevo valor de la asignación en esta instrucción. Para lograr una mayor claridad, la instrucción de asignación múltiple debe dividirse en dos o más instrucciones de asignación simples.

Cómo corregir infracciones

Para corregir las infracciones, divida la instrucción de asignación múltiple en dos o más instrucciones de asignación simples. Por ejemplo, el siguiente fragmento de código muestra una infracción de la regla y un par de formas de corregirla en función de la intención del usuario:

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

Cuándo suprimir las advertencias

No suprima las infracciones de esta regla.

Consulte también