2010-01-15 11 views
15

Vom documentation:C# Structs: Nicht zugewiesene lokale Variable?

Unlike classes, structs can be instantiated without using a new operator.

Warum bin ich diesen Fehler:

Use of unassigned local variable 'x'

Wenn ich versuche, dies zu tun?

 Vec2 x; 
     x.X = det * (a22 * b.X - a12 * b.Y); 
     x.Y = det * (a11 * b.Y - a21 * b.X); 

Wo ist Vec2 x eine Struktur?

Antwort

18

Nun, sind X und Y Eigenschaften (anstatt Felder)? Wenn ja, ist das das Problem. Bis alle Felder innerhalb x definitiv zugewiesen sind, können Sie keine Methoden oder Eigenschaften aufrufen.

Zum Beispiel:

public struct Foo 
{ 
    public int x; 
    public int X { get { return x; } set { x = value; } } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo a; 
     a.x = 10; // Valid 

     Foo b; 
     b.X = 10; // Invalid 
    } 
} 

Ist Vec2 Ihre eigene Art? Haben Sie Zugriff auf die betroffenen Felder oder nur auf die Eigenschaften?

Wenn es Ihre eigene Art ist, würde ich stark Sie drängen, zu versuchen, zu unveränderlichen Strukturen beizubehalten. Ich weiß, dass managed DirectX einige veränderbare Strukturen hat, um so nahe wie möglich an die optimale Leistung heranzukommen, aber das kostet seltsame Situationen wie diese - und viel schlimmer, um ehrlich zu sein.

würde ich persönlich geben der Struktur einen Konstruktor unter X und Y:

Vec2 x = new Vec2(det * (a22 * b.X - a12 * b.Y), 
        det * (a11 * b.Y - a21 * b.X)); 
+0

Ah, das waren Eigenschaften. Guter Fang! Ich werde darüber nachdenken, X und Y privat zu machen, wenn ich damit durchkommen kann. – mpen

+2

+1. Netter, Jon. –

+0

Ich bin sehr neu und würde definitiv eine Antwort auf diesen Zweifel zu schätzen wissen: Wenn ich x direkt wie gezeigt einstellen kann, was nützt es, eine Setter-Methode zu haben? Ich habe das selbe Problem, aber die Struktur, die ich habe, hat x als private öffentliche Getter- und Setter-Methoden gesetzt, um sie zu manipulieren. Wie soll ich damit arbeiten? – darnir

9

Es ist noch nicht initialisiert ist. Sie müssen es initialisieren, bevor Sie es verwenden. Sie können default Betreiber dafür verwenden, wenn Sie einen statischen Vec.Empty Wert und zufrieden mit den Standardeinstellungen für die structs Mitglieder schaffen nicht wollen:

Vec2 x = default(Vec2); 

Mitch Weizen:

Dies ist jedoch nicht:

public struct Vec2 
{ 
    int x; 
    int y; 

    public float X { get { return x; } set { x = value; } } 
    public float Y { get { return y; } set { y = value; } } 

} 
static void Main(string[] args) 
{ 
    Vec2 x; 

    x.X = 1; 
    x.Y = 2; 
} 

der Compiler verhindert, dass Sie ruft propertis auf Typen, bevor alle ihre Mitglieder initialisiert wurden, obwohl eine Eigenschaft könnte festgelegt nur einer der Werte. Die Lösung, wie Jon Skeet vorgeschlagen hat, soll einen Initialisierungskonstruktor und vorzugsweise keine Setter haben.