Структура с изначально недопустимыми полями - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь создать структуру, в которой есть два поля, которые я могу проверить на правильность / недействительность сразу после создания.так как эти два поля по умолчанию 0, я бы хотел проверить их на недействительность, если они -1 ...

public struct InputCodeSet
{
    public int primary;
    public int secondary;


    public InputCodeSet(int primary = -1, int secondary = -1)
    {
        this.primary = primary;
        this.secondary = secondary;
    }

    public bool IsValid
    {
        get { return primary > -1 && primary < InputCode.MAX && secondary > -1 && secondary < InputCode.MAX; }
    }
}

Однако проверка любого созданного InputCodeSet приводит к IsValid всегда является истиной после создания, даже если первичный или вторичный не был установлен.Очевидно, значения по умолчанию в необязательных параметрах конструктора игнорируются?Есть ли другие способы заставить это работать?Я хотел бы использовать в основном синтаксис инициализатора объектов с ними ...

var inputCode1 = new InputCodeSet { primary = InputCode.55 }

1 Ответ

0 голосов
/ 24 сентября 2018

Структуры имеют отдельные конструкторы по умолчанию без параметров, которые при вызове не вызывают перегрузки конструктора параметрами, даже если все параметры являются необязательными.Таким образом, создание структуры без передачи аргументов ее конструктору вызывает ее конструктор по умолчанию и вызывает инициализацию ее полей как 0, полностью игнорируя ваш конструктор с необязательными параметрами.

Из документации :

Если вы создаете экземпляр объекта struct с помощью конструктора по умолчанию, без параметров, все члены назначаются в соответствии со значениями по умолчанию.

Возможно, вы могли бы сделать эти поля обнуляемыми и проверитьдля нуля вместо -1:

public struct InputCodeSet
{
    public int? primary;
    public int? secondary;

    public InputCodeSet(int? primary = null, int? secondary = null)
    {
        this.primary = primary;
        this.secondary = secondary;
    }

    public bool IsValid
    {
        get { return primary != null && primary < InputCode.MAX && secondary != null && secondary < InputCode.MAX; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...