2010-01-15 40 views
15

Desde el documentation:C# Structs: variable local no asignada?

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

Entonces, ¿por qué recibo este error:

Use of unassigned local variable 'x'

Cuando trato de hacer esto?

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

¿Dónde Vec2 x es una estructura?

Respuesta

18

Bueno, ¿son propiedades X e Y (en lugar de campos)? Si es así, ese es el problema. Hasta que todos los campos dentro de x estén definitivamente asignados, no puede llamar a ningún método o propiedad.

Por ejemplo:

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

Es Vec2 su propio tipo? ¿Tiene acceso a los campos involucrados, o solo a las propiedades?

Si es su propio tipo, quisiera fuertemente le pido que intente adherirse a las estructuras inmutables. Sé que DirectX administrado tiene algunas estructuras mutables para obtener lo más cercano posible al rendimiento óptimo, pero eso es a costa de situaciones extrañas como esta, y mucho peor, para ser sincero.

personalmente me gustaría dar la estructura de un constructor teniendo X e Y:

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

Ah, eran propiedades. ¡Buena atrapada! Consideraré que X e Y son privados si puedo salirse con la tuya. – mpen

+2

+1. Bonito, Jon. –

+0

Soy muy nuevo en esto y definitivamente agradecería una respuesta a esta duda: si puedo establecer x directamente como se muestra, ¿de qué sirve tener un método setter? Tengo el mismo problema, sin embargo, la estructura que tengo x ha establecido como un método público privado getter y setter para manipularlo. ¿Cómo debería trabajar con eso? – darnir

9

Todavía no está inicializado. Debe inicializarlo antes de usarlo. Puede utilizar default operador para que si usted no desea crear un valor estático Vec.Empty y feliz con los valores por defecto para los miembros structs:

Vec2 x = default(Vec2); 

Mitch Trigo:

Esto, sin embargo no lo hace:

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

El compilador le impide llamar Propertis sobre los tipos antes de que todos sus miembros se han inicializado, a pesar de que una propiedad sólo podría fijar uno de los valores. La solución, como propuso Jon Skeet, es tener un constructor de inicialización y preferiblemente ningún instalador.

Cuestiones relacionadas