2010-01-15 4 views
15

De l'documentation:C# Structs: variable locale non affectée?

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

Alors, pourquoi suis-je recevoir cette erreur:

Use of unassigned local variable 'x'

Lorsque je tente de le faire?

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

Vec2 x est une structure?

Répondre

18

Eh bien, sont des propriétés X et Y (plutôt que les champs)? Si oui, c'est le problème. Tant que tous les champs x ne sont pas affectés, vous ne pouvez appeler aucune méthode ou propriété.

Par exemple:

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

Est-Vec2 votre propre type? Avez-vous accès aux champs concernés, ou seulement aux propriétés?

Si c'est votre propre type, je voudrais vivement vous demander d'essayer de coller à des structures immuables fortement. Je sais que DirectX a des structures mutables qui lui permettent de se rapprocher le plus possible des performances optimales, mais c'est au prix de situations étranges comme celle-ci - et pire, pour être honnête.

que je donnerais personnellement struct un constructeur prenant X et Y:

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

Ah, ils étaient des propriétés. Bonne prise! Je vais considérer X et Y comme privés si je peux m'en sortir. – mpen

+2

+1. Sympa, Jon. –

+0

Je suis très nouveau à ce sujet et apprécierais certainement une réponse à ce doute: Si je peux mettre x directement comme indiqué, quelle est l'utilité d'avoir une méthode setter? J'ai le même problème, cependant, la structure que j'ai a été définie comme des méthodes getter et setter publiques privées pour la manipuler. Comment devrais-je travailler avec ça? – darnir

9

Il est encore non initialisée. Vous devez l'initialiser avant de l'utiliser. Vous pouvez utiliser default opérateur pour que si vous ne voulez pas créer une valeur Vec.Empty statique et heureux avec les paramètres par défaut pour les membres de structs:

Vec2 x = default(Vec2); 

Mitch Blé:

Cela ne signifie toutefois pas:

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

Le compilateur vous empêche d'appeler propertis sur les types avant que tous ses membres ont été initialisés, même si une propriété pourrait bien définir l'une des valeurs. La solution, comme l'a proposé Jon Skeet, est d'avoir un constructeur d'initialisation et de préférence pas de setters.

Questions connexes