Конструктор Struct: “поля должны быть полностью присвоены, прежде чем управление возвращается вызывающей стороне”.

Вот структура, которую я пытаюсь записать:

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

Это приводит к следующим ошибкам компиляции:

'Этот' объект не может использоваться, прежде чем всем его полям присваивают

Поле 'AttackTraits.probability' должно быть полностью присвоено, прежде чем управление возвращается вызывающей стороне

Поле Backing для автоматически реализованного свойства 'AttackTraits. Damage' должно быть полностью присвоено, прежде чем управление возвращается вызывающей стороне. Рассмотрите вызов конструктора по умолчанию от инициализатора конструктора.

Поле Backing для автоматически реализованного свойства 'AttackTraits. Distance' должно быть полностью присвоено, прежде чем управление возвращается вызывающей стороне. Рассмотрите вызов конструктора по умолчанию от инициализатора конструктора.

Что я делаю неправильно?

106
задан svick 13 April 2014 в 21:00
поделиться

3 ответа

Вы устанавливаете поле вероятности через свойство Probability , но компилятор не знает, что это свойство задает поле ... поэтому вам нужно явно инициализировать само поле вероятности

public AttackTraits(double probability, int damage, float distance)
{
    this.probability = 0;
    Distance = distance;
    Damage = damage;
}
31
ответ дан 24 November 2019 в 03:44
поделиться

пытается получить доступ к полю вероятности, а не к источнику доступа. В этом случае автоподдержки тоже должны работать.

Структура не может иметь конструктор без параметров, поэтому лучше заменить его на класс.

Лучше всего использовать структуры только в том случае, если они имеют размер не более 16 байт и являются неизменяемыми. Поэтому, если вы собираетесь изменить поля объекта после создания, подумайте о его преобразовании в класс.

Кроме того, вы можете изменить определение конструктора на:

construct(params) : this()

это также удалит ошибку

51
ответ дан 24 November 2019 в 03:44
поделиться

Измените строку Вероятность = вероятность на this.probability = вероятность

В будущем выберите другое соглашение об именах для полей как и для параметров. Например, поставьте перед всеми полями знак подчеркивания, чтобы вы могли просто вызвать это:

_probability = probability;

и легко увидеть, что происходит.

2
ответ дан 24 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: