2011-03-01 11 views
6

Tengo el siguiente código que no está permitido (error a continuación), ¿por qué?¿Por qué no funciona la configuración de la propiedad en el constructor de una estructura?

struct A 
    { 
     private int b; 

     public A(int x) 
     { 
      B = x; 
     } 
     public int B 
     { 
      get { return b; } 
      set { b=value; } 
     } 

    } 

recibo el siguiente error:

The 'this' object cannot be used before all of its fields are assigned to Field 'Test.x' must be fully assigned before control is returned to the caller

+0

verifique mi respuesta, obtendrá una idea al respecto –

Respuesta

1

Cambiar la constructora para:

public A(int x) : 
    this() 
{ 
    B = x; 
} 

En cuanto a "qué", se refieren a 11.3.8 Constructors y 5.3 Definite assignment.

+0

Solo me pregunto, ¿qué diferencia haría eso? –

+0

Esto hace que usted resuelva el problema – Dotnet

+0

@Gunner: Este código eliminará este error. De lo contrario, tendrá un error ya que 'Este' no se puede utilizar antes de que se asignen todos sus campos – Dotnet

1

De MSDN "Dentro de una declaración de estructura, los campos no se pueden inicializar a menos que se declaren como const o estáticos."

+0

Esto se refiere a los inicializadores de campo; este ** no es ** un inicializador de campo. –

4

Las variables de una estructura deben asignarse definitivamente antes de poder utilizar cualquier método o propiedad. Hay dos arreglos posibles aquí:

1) Puede llamar explícitamente al constructor sin parámetros:

public A(int x) : this() 
{ 
    B = x; 
} 

2) Se puede utilizar el campo en lugar de la propiedad:

public A(int x) 
{ 
    b = x; 
} 

Por supuesto, el La segunda opción solo funciona en su forma actual - usted tiene para usar la primera opción si desea cambiar su estructura para usar una propiedad automática.

Sin embargo, es importante que ahora tenga una estructura mutable. Esto casi siempre es una muy mala idea . Me fuertemente instar a usar algo como esto en su lugar:

struct A 
{ 
    private readonly int b; 

    public A(int x) 
    { 
     b = x; 
    } 

    public int B { get { return b; } } 
} 

EDIT: Más detalles de por qué el código original no funciona ...

Desde la sección 11.3.8 de la especificación C# :

If the struct instance constructor doesn't specify a constructor initializer, the this variable corresponds to an out parameter of the struct type

Ahora inicialmente que no se asignaron claramente, lo que significa que no puede ejecutar ninguna función miembro (incluyendo emisores de propiedad) hasta que todas las primicias de la estructura ser constructo ed han sido definitivamente asignados. El compilador no sabe o intenta tener en cuenta el hecho de que el creador de propiedades no intenta leer desde otro campo. Es todo para evitar leer de campos que no han sido asignados definitivamente.

+0

Bueno, no entiendo. ¿Cuál es la diferencia entre la configuración de la propiedad que hace lo mismo (b = valor) y hacerlo manualmente? Todavía no puedo ver por qué B = x no funciona. BTW struct variables son campos o debería llamarlos variables? – Mocco

+0

@Cocodrilo - porque no se puede hacer * nada * con una estructura hasta que esté completamente inicializada, lo que puede hacerse llamando al constructor predeterminado (y, como ocurre, falso), o puede asignarse explícitamente a todos los campos. No puede acceder a una propiedad (que es un método) hasta que esté hecho. "1" arriba muestra la primera opción (constructor), "2" arriba muestra la opción "asignar todos los campos". –

+0

@Cocodrilo y solo para secundar el punto de Jon; las estructuras mutables son muy muy malas mojo. –

Cuestiones relacionadas