次の方法で共有


CA2246: 同じステートメントにシンボルとそのメンバーを割り当てません

プロパティ
ルール ID CA2246
Title 同じステートメントにシンボルとそのメンバーを割り当てません
[カテゴリ] 使用方法
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 提案として

原因

同じステートメントにシンボルとそのメンバーが割り当てられました。 次に例を示します。

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

規則の説明

同じステートメントでシンボルとそのメンバー、つまりフィールドまたはプロパティを代入することは推奨されていません。 メンバー アクセスが代入前のシンボルの古い値を使用するのか、このステートメントの代入からの新しい値を使用するのかが明確ではありません。 わかりやすくするため、複数代入のステートメントは、2 つ以上の単純代入ステートメントに分割する必要があります。

違反の修正方法

違反を修正するには、複数代入のステートメントを 2 つ以上の単純代入ステートメントに分割します。 たとえば、次のコード スニペットで、規則の違反と、ユーザーの意図に基づいてそれを修正するいくつかの方法を示しています。

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

どのようなときに警告を抑制するか

この規則からは違反を抑制しないでください。

関連項目