Struct - Layout.Explicit - Constructor - полностью назначить поля - PullRequest
8 голосов
/ 07 февраля 2012

Почему, если я использую:

struct MyStruct
{
        [FieldOffset (0)] public uint Data;
        [FieldOffset (0)] public byte Something;
}

public MyStruct (uint pData)
{
   Data = pData; // setting Data field also sets Something field
}

C # говорит, что мне нужно назначить поле 'Something': / Я знаю, что могу сделать «Constructor: this ()», но компилятор должен знать поле «Data»содержит поле 'Something'.

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

Ответы [ 3 ]

5 голосов
/ 16 ноября 2015

Да, вам нужно вызвать конструктор по умолчанию.

public MyStruct (uint pData) : this()
{
   //...
}

Затем компилятор сгенерирует следующие инструкции IL в начале вашего конструктора:

ldarg.0           // Push address of struct onto stack
initobj MyStruct  // Pop address of struct and initialize it with "all zeros"
0 голосов
/ 17 июня 2017

Кажется, что это невозможно, и дискуссия об этом закрыта:

Вот ссылка на обсуждение этой проблемы:

https://github.com/dotnet/roslyn/issues/7323

0 голосов
/ 07 февраля 2012

Вам нужно инициализировать все поля структуры, если вы определяете пользовательский конструктор. См. этот учебник MSDN в структурах для получения дополнительной информации - в частности, под заголовком Constructors and Inheritence.

Вот параграф, извлеченный из этой ссылки относительно этого:

Структуры могут объявлять конструкторы, но они должны принимать параметры. Ошибочно объявлять конструктор по умолчанию (без параметров) для структуры. Члены структуры не могут иметь инициализаторы. Конструктор по умолчанию всегда предоставляется для инициализации членов структуры их значениями по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...