Поделиться через


CA2246: не назначайте символ и его член в той же инструкции.

Свойство Значение
Идентификатор правила CA2246
Заголовок не присваивайте значения символу и его элементу в одном операторе
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 9 Как предложение

Причина

Символ и его элемент были назначены в одном операторе. Например:

// 'a' and 'a.Field' are assigned in the same statement
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.
        // 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;'
    }
}

Когда лучше отключить предупреждения

Не отключайте предупреждения для этого правила.

См. также