Nick Heiner Nick Heiner - 29 days ago 10
C# Question

Struct constructor: "fields must be fully assigned before control is returned to the caller."

Here is a struct I am trying to write:

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; }
}


This results in the following compilation errors:


The 'this' object cannot be used
before all of its fields are assigned
to

Field 'AttackTraits.probability' must
be fully assigned before control is
returned to the caller

Backing field for automatically
implemented property
'AttackTraits.Damage' must be fully
assigned before control is returned to
the caller. Consider calling the
default constructor from a constructor
initializer.

Backing field for automatically
implemented property
'AttackTraits.Distance' must be fully
assigned before control is returned to
the caller. Consider calling the
default constructor from a constructor
initializer.


What am I doing wrong?

Answer

You're setting the probability field through the Probability property, but the compiler doesn't know that the property sets the field... so you need to explicitly initialize the probability field itself

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