CA2246: Tilldela inte en symbol och dess medlem i samma instruktion
Property | Värde |
---|---|
Regel-ID | CA2246 |
Title | Tilldela inte en symbol och dess medlem i samma instruktion |
Kategori | Användning |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Som förslag |
Orsak
En symbol och dess medlem tilldelades i samma instruktion. Till exempel:
// 'a' and 'a.Field' are assigned in the same statement
a.Field = a = b;
Regelbeskrivning
Att tilldela en symbol och dess medlem, dvs. ett fält eller en egenskap, i samma instruktion rekommenderas inte. Det är oklart om medlemsåtkomsten var avsedd att använda symbolens gamla värde före tilldelningen eller det nya värdet från tilldelningen i den här instruktionen. För tydlighetens skull måste multi-assign-instruktionen delas upp i två eller flera enkla tilldelningsinstruktioner.
Så här åtgärdar du överträdelser
Om du vill åtgärda överträdelser delar du upp multi-assign-instruktionen i två eller flera enkla tilldelningsinstruktioner. Följande kodfragment visar till exempel ett brott mot regeln och ett par sätt att åtgärda den baserat på användarens avsikt:
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;'
}
}
När du ska ignorera varningar
Förhindra inte överträdelser från den här regeln.