CA2246: Wijs een symbool en een lid daarvan niet toe binnen dezelfde statement

Eigenschap Waarde
Regel-id CA2246
Titel Wijs geen symbool en het bijbehorende lid in dezelfde instructie toe
Categorie Gebruik
Fix kan brekend of niet-brekend zijn Niet-brekend
Standaard ingeschakeld in .NET 10 Als suggestie
Toepasselijke talen C# en Visual Basic

Oorzaak

Een symbool en het bijbehorende lid zijn toegewezen in dezelfde instructie. Voorbeeld:

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

Beschrijving van regel

Het toewijzen van een symbool en het bijbehorende lid, dat wil zeggen, een veld of eigenschap, in dezelfde instructie wordt niet aanbevolen. Het is niet duidelijk of de lidtoegang bedoeld is om de oude waarde van het symbool te gebruiken vóór de toewijzing of de nieuwe waarde na de toewijzing in deze instructie. Voor de duidelijkheid moet de instructie voor meerdere toewijzingen worden gesplitst in twee of meer eenvoudige toewijzingsinstructies.

Hoe schendingen op te lossen

Als u schendingen wilt oplossen, splitst u de instructie voor meerdere toewijzingen op in twee of meer eenvoudige toewijzingsinstructies. In het volgende codefragment ziet u bijvoorbeeld een schending van de regel en een aantal manieren om dit op te lossen op basis van de intentie van de gebruiker:

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

Wanneer waarschuwingen onderdrukken

Geen schendingen van deze regel onderdrukken.

Zie ook