El código que se tiene es equivalente al código siguiente:
public struct DealImportRequest
{
private DealRequestBase _dr;
private int _irc;
public DealRequestBase DealReq
{
get { return _dr; }
set { _dr = value; }
}
public int ImportRetryCounter
{
get { return _irc; }
set { _irc = value; }
}
/* Note we aren't allowed to do this explicitly - this is didactic code only and isn't allowed for real*/
public DealImportRequest()
{
this._dr = default(DealRequestBase); // i.e. null or default depending on whether this is reference or value type.
this._irc = default(int); // i.e. 0
}
public DealImportRequest(DealRequestBase drb)
{
this.DealReq = drb;
this.ImportRetryCounter = 0;
}
}
Ahora, todo lo que he hecho aquí es quitar el azúcar sintáctica que:
- Implementa propiedades automáticas.
- Resuelve qué miembros se tratan en relación con
this
.
- Otorga a todos
struct
s un constructor sin parámetro predeterminado.
Los dos primeros son opcionales (se podría escribir de forma explícita si hubiese deseado), pero el tercero no es - no se nos permite escribir nuestro propio código para un struct
's constructor sin parámetros, tenemos que ir con uno que funciona como el del código anterior que se nos da automáticamente.
Ahora, aquí se ve claramente el significado de los dos errores: el constructor usa implícitamente this
antes de asignar los campos (error 188) y esos campos son los que respaldan las propiedades automáticas (error 843).
Es una combinación de diferentes funciones automáticas que normalmente no tenemos que pensar, pero en este caso no funcionan bien. Podemos solucionar este problema siguiendo los consejos en el mensaje de error para 843 y llamar al constructor por defecto como parte de su constructor explícito:
public DealImportRequest(DealRequestBase drb)
:this()
{
DealReq = drb;
ImportRetryCounter = 0;
}
Teniendo en cuenta esto en relación con mi versión ampliada de su código anterior, se puede ver cómo esto resuelve el problema, ya que llama al constructor que asigna los campos de respaldo antes de que proceda.
Posible duplicado de http://stackoverflow.com/questions/2534960/c-struct-constructor-fields-must-be-fully-assigned-before-control-is-returned – Hps
@Hps, no estoy de acuerdo. Si bien se relaciona con el mismo problema que en esa pregunta, el hecho de que hacerlo en relación con un campo implícito (respaldar la propiedad automática) en lugar de uno explícito podría ser suficiente para evitar que alguien vea por qué se relacionan estas dos preguntas. Eso debería ser suficiente para considerar que no duplican la IMO. –
Tiene razón. Gracias por la explicación. Debería ser más cuidadoso :) – Hps