Nick Heiner - 2 months ago 22

C# Question

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