Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En fältinitierare kan inte referera till det icke-statiska fältet, metoden eller egenskapen "name".
Instansfält kan inte användas för att initiera andra instansfält utanför en metod.
Varför det här felet inträffar
Kompilatorn tillämpar den här begränsningen på grund av hur objektinitiering fungerar i C#. När ett objekt skapas bearbetas fältinitierare innan någon konstruktorkod körs. Under den här fasen:
Begränsning av fältberoende: Medan fältinitierare bearbetas i lexikal ordning i en enda fil, förhindrar regeln beroenden mellan fält så att klassförfattare kan ordna om fält utan att införa kompilatorfel. För partiella klasser anges inte ordningen på fältinitierare för olika källfiler.
Objektet är inte helt konstruerat: När fältinitierare körs är objektinstansen i ett ofullständigt tillstånd. Att tillåta referenser mellan fält under den här fasen kan leda till åtkomst till oinitierat minne eller oförutsägbart beteende.
Kompilatorsäkerhet: Den här begränsningen förhindrar potentiella körningsfel och säkerställer förutsägbart beteende för objektkonstruktion.
Kompilatorn identifierar det här mönstret under kompilering och rapporter CS0236 för att förhindra dessa potentiella problem.
Så här åtgärdar du det här felet
Flytta initieringen till konstruktorn: Utför initieringen i en instanskonstruktor där alla fält garanterat är tillgängliga.
Använd statiska fält: Om det refererade fältet inte behöver vara instansspecifikt bör du överväga att göra det statiskt.
Använd standardvärden: Initiera fält med literalvärden eller uttryck som inte refererar till andra instansmedlemmar.
Fördröjd initiering: Använd egenskaper med backande fält för komplex initieringslogik som är beroende av andra instansmedlemmar.
Exempel
Följande exempel genererar CS0236 och visar hur du åtgärdar det:
public class MyClass
{
public int i = 5;
// CS0236: Field initializer cannot reference instance field 'i'
// This restriction allows class authors to rearrange fields without compiler errors
public int j = i; // CS0236
public MyClass()
{
// This works because both fields are guaranteed to be initialized
// before constructor code runs
j = i;
}
}
Ytterligare exempel
Följande exempel visar olika scenarier där CS0236 inträffar:
public class Examples
{
private string name = "Default";
// CS0236: Cannot reference instance field in initializer
private string displayName = name.ToUpper();
// CS0236: Cannot reference instance method in initializer
private int length = GetNameLength();
// CS0236: Cannot reference instance property in initializer
private string formatted = FormattedName;
public string FormattedName => $"Name: {name}";
private int GetNameLength() => name.Length;
public Examples()
{
// All of these work in the constructor:
displayName = name.ToUpper();
length = GetNameLength();
formatted = FormattedName;
}
}