Почему нестатические поля не могут быть инициализированы в структурах?

Рассмотрите этот блок кода:

struct Animal
{
    public string name = ""; // Error
    public static int weight = 20; // OK

    // initialize the non-static field here
    public void FuncToInitializeName()
    {
        name = ""; // Now correct
    }
}
  • Почему мы можем инициализировать a static поле в структуре, но не a non-static поле?
  • Почему мы должны инициализировать non-static в телах методов?
20
задан Peter Mortensen 24 October 2012 в 16:44
поделиться

3 ответа

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

Инициализаторы статических полей перемещены в статический конструктор. Вы можете написать собственный статический конструктор в структуре.

0
ответ дан 30 November 2019 в 01:34
поделиться

Вы можете делать именно то, что пытаетесь. Все, что вам не хватает, - это настраиваемый конструктор, который вызывает конструктор по умолчанию:

struct Animal
{
    public string name = ""; 
    public static int weight = 20; 

    public Animal(bool someArg) : this() { }
}

Конструктор должен принять хотя бы один параметр, а затем он должен перенаправить на this () для инициализации членов.

Причина, по которой это работает, заключается в том, что теперь у компилятора есть способ определить моменты, когда код должен запускаться для инициализации поля name : всякий раз, когда вы пишете new Animal (someBool) .

С любой структурой вы можете сказать new Animal () , но «пустые» животные могут быть созданы неявно во многих обстоятельствах в работе CLR, и нет способа гарантировать, что пользовательский код запускается каждый раз, когда это происходит.

-1
ответ дан 30 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

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