with property net microsoft implemented example español define c# .net constructor automatic-properties

property - properties in c# with example



La propiedad implementada automáticamente en la estructura no puede ser asignada (4)

Agrega una llamada al constructor por defecto:

public T(int u) : this() { this.U = 10; }

Tengo un código siguiente:

struct T { public T(int u) { this.U = 10; //Errors are here } public int U { get; private set; } }

El compilador de C # me da un par de errores en la línea indicada: 1) El campo de respaldo para la propiedad ''TestConsoleApp.Program.TU'' implementada automáticamente debe asignarse por completo antes de que se devuelva el control a la persona que llama. Considere llamar al constructor predeterminado desde un inicializador de constructor. 2) El objeto ''this'' no se puede usar antes de que todos sus campos se asignen a

¿Qué hice mal? Ayúdame a entender.


Bueno, para empezar, estás creando una estructura mutable, que casi siempre es una muy mala idea . Las estructuras mutables a veces pueden comportarse de una manera que usted no espera. Está bien, solo es mutable de forma privada , pero el hecho de que hayas escrito un código para mutarlo es una mala señal.

El motivo del segundo error es que no puede usar ninguna propiedad o método de la estructura hasta que todos los campos hayan sido asignados, por lo que necesita encadenar al constructor implícito sin parámetros:

public T(int u) : this() { this.U = 10; }

El compilador requiere que cualquier constructor deje todos los campos definitivamente asignados (por lo que recibió el primer error antes; el compilador no "sabe" que la propiedad asigna un valor al campo): al encadenar this() , usted Asegúrate de que para cuando llegues al cuerpo del constructor, todos los campos ya estén asignados definitivamente, y ya no tendrás que preocuparte más.

Sin embargo, a menos que realmente desee permitir la mutación, le sugiero que simplemente la convierta en una propiedad de sólo lectura:

struct T { private readonly int u; public T(int u) { this.u = 10; } public int U { get { return u; } } }

Ahora es más obvio que no quieres mutarlo incluso dentro de la estructura en sí .


De la especificación de C #:

10.7.3 Propiedades implementadas automáticamente

Cuando una propiedad se especifica como una propiedad implementada automáticamente, un campo de respaldo oculto está automáticamente disponible para la propiedad, y los accesores se implementan para leer y escribir en ese campo de respaldo.

[Eliminado]

Debido a que el campo de respaldo es inaccesible, se puede leer y escribir solo a través de los accesores de propiedades, incluso dentro del tipo que lo contiene.

[Eliminado]

Esta restricción también significa que la asignación definitiva de los tipos de estructura con propiedades implementadas automáticamente solo se puede lograr utilizando el constructor estándar de la estructura, ya que la asignación a la propiedad en sí requiere que la estructura se asigne definitivamente. Esto significa que los constructores definidos por el usuario deben llamar al constructor predeterminado.

Así que necesitas esto:

struct T { public T(int u) : this() { this.U = u; } public int U { get; private set; } }


Tienes que usar el constructor por defecto aquí:

struct T { public int U { get; private set; } public T(int u) : this() { U = 10; } }