Инициализация структуры C # с ошибкой компиляции, но работает правильно - PullRequest
0 голосов
/ 30 июля 2009

Внутри структуры XNA Vector2 находятся две открытые переменные X и Y. У меня есть следующий код:

Vector2 v; если (б) v.X = 1; иначе v.Y = 2;

// использовать v

Компилятор выдает "Использование неназначенной локальной переменной 'v'" Но, тем не менее, он работает правильно.

Есть ли более правильный способ сделать это?

Ответы [ 3 ]

4 голосов
/ 30 июля 2009

C # требует, чтобы вы присвоили значение локальным переменным перед их использованием.

Vector2 v = new Vector2();
2 голосов
/ 30 июля 2009

Это работает, потому что структура автоматически инициализируется. Все его члены имеют значение по умолчанию для их Типа. Но если вы используете такую ​​неназначенную переменную, обычно это потому, что вы забыли назначить ее раньше. Я предполагаю, что компилятор не делает различий между структурами и классами здесь.

0 голосов
/ 30 июля 2009

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

  • Конструкторы по умолчанию не допускаются.
  • Конструкторы должны инициализировать все поля в структуре.

Если вы не создаете экземпляр структуры через конструктор, тогда все члены устанавливаются в результат вызова default() для типа члена. Это позволяет использовать структуры в массивах. Это также позволяет вам делать то, что вы делаете, но также является причиной предупреждения.

В идеале вы должны определить конструктор и инициализировать структуру с помощью конструктора.

Редактировать: Чтобы прояснить ограничение для конструктора по умолчанию (без параметров), вы не можете явно определить его, поскольку компилятор предоставляет тот, который он использует для инициализации всех членов.

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