Constructor de Struct: “los campos deben asignarse por completo antes de devolver el control a la persona que llama”.

Aquí hay una estructura que bash escribir:

public struct AttackTraits { public AttackTraits(double probability, int damage, float distance) { Probability = probability; Distance = distance; Damage = damage; } private double probability; public double Probability { get { return probability; } set { if (value > 1 || value < 0) { throw new ArgumentOutOfRangeException("Probability values must be in the range [0, 1]"); } probability = value; } } public int Damage { get; set; } public float Distance { get; set; } } 

Esto produce los siguientes errores de comstackción:

El objeto ‘this’ no se puede usar antes de que todos sus campos estén asignados a

El campo ‘AttackTraits.probability’ debe asignarse por completo antes de devolver el control a la persona que llama

El campo de respaldo para la propiedad implementada automáticamente ‘AttackTraits.Damage’ debe asignarse por completo antes de devolver el control a la persona que llama. Considere llamar al constructor predeterminado desde un inicializador de constructor.

El campo de respaldo para la propiedad implementada automáticamente ‘AttackTraits.Distance’ debe asignarse por completo antes de devolver el control al llamante. Considere llamar al constructor predeterminado desde un inicializador de constructor.

¿Qué estoy haciendo mal?

Está configurando el campo de probability través de la propiedad Probability , pero el comstackdor no sabe que la propiedad establece el campo … por lo que debe inicializar explícitamente el campo de probabilidad en sí mismo

 public AttackTraits(double probability, int damage, float distance) { this.probability = 0; Distance = distance; Damage = damage; } 

Si ve este error en una estructura que tiene una propiedad automática, simplemente llame al contructor sin parámetros de su parametrizado haciendo : this() ejemplo a continuación:

 struct MyStruct { public int SomeProp { get; set; } public MyStruct(int someVal) : this() { this.SomeProp = someVal; } } 

Al invocar: this () desde su statement de constructor, permite que la clase ValueType base inicialice todos los campos de respaldo para las propiedades automáticas. No podemos hacerlo manualmente en nuestro constructor porque no tenemos acceso al campo de respaldo de una propiedad automática. ValueType es la clase base de todas las estructuras.

intente acceder al campo de probabilidad, no al acceso. En este caso, los accesorios automáticos deberían funcionar también.

No hay forma de que una estructura tenga un constructor sin parámetros, así que considere cambiarla a clase.

La mejor práctica es usar estructuras solo si tienen 16 bytes o menos y son inmutables. Entonces, si va a cambiar los campos del objeto después de la creación, considere refactorizarlo a la clase.

Además, puede cambiar la definición del constructor a:

 construct(params) : this() 

esto eliminará el error también

Cambie la línea Probability = probability a this.probability = probability

En el futuro, elija una convención de nomenclatura diferente para los campos como lo hace para los parámetros. Por ejemplo, prefija todos los campos con un guión bajo, de modo que simplemente puede llamar a esto:

 _probability = probability; 

y ver fácilmente lo que está sucediendo.