Рассмотрите этот блок кода:
struct Animal
{
public string name = ""; // Error
public static int weight = 20; // OK
// initialize the non-static field here
public void FuncToInitializeName()
{
name = ""; // Now correct
}
}
static
поле в структуре, но не a non-static
поле?non-static
в телах методов?Вы не можете написать собственный конструктор по умолчанию в структуре. Инициализаторы поля экземпляра в конечном итоге нужно будет переместить в конструктор, который вы не можете определить.
Инициализаторы статических полей перемещены в статический конструктор. Вы можете написать собственный статический конструктор в структуре.
Вы можете делать именно то, что пытаетесь. Все, что вам не хватает, - это настраиваемый конструктор, который вызывает конструктор по умолчанию:
struct Animal
{
public string name = "";
public static int weight = 20;
public Animal(bool someArg) : this() { }
}
Конструктор должен принять хотя бы один параметр, а затем он должен перенаправить на this ()
для инициализации членов.
Причина, по которой это работает, заключается в том, что теперь у компилятора есть способ определить моменты, когда код должен запускаться для инициализации поля name
: всякий раз, когда вы пишете new Animal (someBool)
.
С любой структурой вы можете сказать new Animal ()
, но «пустые» животные могут быть созданы неявно во многих обстоятельствах в работе CLR, и нет способа гарантировать, что пользовательский код запускается каждый раз, когда это происходит.