Structconstructor: “velden moeten volledig worden toegewezen voordat de besturing wordt teruggegeven aan de beller.”

Hier is een structuur die ik probeer te schrijven:

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

Dit resulteert in de volgende compilatiefouten:

Het ‘dit’ object kan niet worden gebruikt
voordat alle velden zijn toegewezen
naar

Veld ‘AttackTraits.probability’ moet
volledig worden toegewezen voordat de controle is
terug naar de beller

Backing-veld voor automatisch
geïmplementeerde eigenschap
‘AttackTraits.Damage’ moet volledig zijn
toegewezen voordat de besturing wordt teruggegeven aan
de beller. Overweeg om de . te bellen
standaardconstructor van een constructor
initialisatie.

Backing-veld voor automatisch
geïmplementeerde eigenschap
‘AttackTraits.Distance’ moet volledig zijn
toegewezen voordat de besturing wordt teruggegeven aan
de beller. Overweeg om de . te bellen
standaardconstructor van een constructor
initialisatie.

Wat doe ik verkeerd?


Antwoord 1, autoriteit 100%

Als u deze fout ziet op een struct die een automatische eigenschap heeft, roept u gewoon de parameterloze contructor van uw geparameteriseerde aan door het onderstaande voorbeeld : this()te doen:

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

Door :this() aan te roepen vanuit uw constructordeclaratie, laat u de basisklasse ValueType alle backing-velden voor de automatische eigenschappen initialiseren. We kunnen dit niet handmatig doen in onze constructor omdat we geen toegang hebben tot het backing-veld van een automatische eigenschap.
ValueType is de basisklasse van alle structs.


Antwoord 2, autoriteit 17%

probeer toegang te krijgen tot het kansveld, niet de accessor. In dit geval zouden auto-props ook moeten werken.

Er is geen manier voor een struct om een ​​parameterloze constructor te hebben, dus overweeg om het in plaats daarvan in klasse te veranderen.

Het beste is om structs alleen te gebruiken als ze 16 bytes of minder zijn en onveranderlijk zijn. Dus als je objectvelden gaat wijzigen nadat je het hebt gemaakt, overweeg dan om het te refactoreren naar klasse.

U kunt ook de constructordefinitie wijzigen in:

construct(params) : this()

dit zal ook de fout verwijderen


Antwoord 3, autoriteit 10%

Je stelt het veld Probabilityin via de eigenschap Probability, maar de compiler weet niet dat de eigenschap het veld instelt… initialiseer het kansveld zelf

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

Antwoord 4

Verander de regel Probability = probabilityin this.probability = probability

Kies in de toekomst een andere naamgevingsconventie voor velden dan voor parameters. Zet bijvoorbeeld alle velden vooraf met een onderstrepingsteken, zodat u dit eenvoudig kunt noemen:

_probability = probability;

en zie gemakkelijk wat er gebeurt.

Other episodes