variable unassigned tipo locales las inicializar implícito deben con c# struct

unassigned - C#Estructuras: ¿Variable local sin asignar?



use of unassigned local variable c# (2)

De la documentation :

A diferencia de las clases, las estructuras se pueden crear instancias sin usar un nuevo operador.

Entonces, ¿por qué estoy recibiendo este error:

Uso de la variable local no asignada ''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);

Donde Vec2 x es una estructura?


Bueno, ¿son las propiedades X e Y (en lugar de los campos)? Si es así, ese es el problema. Hasta que todos los campos dentro de x estén definitivamente asignados, no puede llamar 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 tu propio tipo? ¿Tiene acceso a los campos involucrados, o solo a las propiedades?

Si se trata de su propio tipo, le recomiendo encarecidamente que intente atenerse a estructuras inmutables. Sé que DirectX administrado tiene algunas estructuras mutables para acercarse lo más posible al rendimiento óptimo, pero eso es a costa de situaciones extrañas como esta, y mucho peor, para ser honesto.

Personalmente le daría a la estructura un constructor tomando X e Y:

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


Todavía está sin inicializar. Necesitas inicializarlo antes de usarlo. Puede usar default operador default para eso si no desea crear un valor Vec.Empty estático y contento con los valores predeterminados para los miembros de la estructura:

Vec2 x = default(Vec2);

Trigo Mitch:

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 a propertis en tipos antes de que todos sus miembros se hayan inicializado, incluso aunque una propiedad pueda establecer uno de los valores. La solución, como propuso Jon Skeet, es tener un constructor de inicialización y, preferiblemente, ningún configurador.