Ich denke , eine Menge Leute hier sind verwirrt zu werden , dieses besondere Problem bezieht sich auf das Verständnis , dass Werttyp Eigenschaften eine Kopie des Werttyp zurückgeben (wie bei Methoden und Indexer) und Werttyp Felder werden direkt zugegriffen . Der folgende Code macht genau das, was Sie erreichen möchten, indem Sie direkt auf das Hintergrundfeld der Eigenschaft zugreifen (Hinweis: Das Ausdrücken einer Eigenschaft in ihrer ausführlichen Form mit einem Hintergrundfeld entspricht einer Auto-Eigenschaft, hat jedoch den Vorteil, dass dies in unserem Code möglich ist direkt auf das Hintergrundfeld zugreifen):
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //succeeds
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
_origin.X = 10; //this works
//Origin.X = 10; // fails with CS1612;
}
}
Der Fehler, den Sie erhalten, ist eine indirekte Folge des Nichtverständnisses, dass eine Eigenschaft eine Kopie eines Werttyps zurückgibt. Wenn Sie eine Kopie eines Werttyps zurückgeben und diese keiner lokalen Variablen zuweisen, können alle Änderungen, die Sie an dieser Kopie vornehmen, niemals gelesen werden. Der Compiler gibt dies daher als Fehler aus, da dies nicht beabsichtigt sein kann. Wenn wir die Kopie einer lokalen Variablen zuweisen, können wir den Wert von X ändern. Er wird jedoch nur für die lokale Kopie geändert, wodurch der Fehler bei der Kompilierung behoben wird, die gewünschte Origin-Eigenschaft jedoch nicht geändert wird. Der folgende Code veranschaulicht dies, da der Kompilierungsfehler behoben ist, die Debug-Bestätigung jedoch fehlschlägt:
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.SetOrigin();
Debug.Assert(myClass.Origin.X == 10); //throws error
}
}
class MyClass
{
private Point _origin;
public Point Origin
{
get => _origin;
set => _origin = value;
}
public void SetOrigin()
{
var origin = Origin;
origin.X = 10; //this is only changing the value of the local copy
}
}