Примечание: ответ ниже был написан задолго до C # 6, который планирует ввести возможность объявлять конструкторы без параметров в структурах - но они все равно не будут вызываться в все ситуации (например, для создания массива) (в конце эта функция не была добавлена в C # 6 ).
РЕДАКТИРОВАТЬ: я отредактировал ответ ниже из-за понимания Грауенвольфом CLR.
CLR позволяет типам значений иметь конструкторы без параметров, а C # - нет. Я полагаю, что это потому, что это привело бы к ожиданию, что конструктор будет вызван, когда это не так. Например, рассмотрим это:
MyStruct[] foo = new MyStruct[1000];
CLR может сделать это очень эффективно, просто выделив соответствующую память и обнулив все это. Если бы ему пришлось запускать конструктор MyStruct 1000 раз, это было бы намного менее эффективно. (На самом деле это не так - если у вас do имеется конструктор без параметров, он не запускается при создании массива или при наличии неинициализированной переменной экземпляра.)
Основное правило в C # - «значение по умолчанию для любого типа не может полагаться ни на какую инициализацию». Теперь они могли позволять определять конструкторы без параметров, но тогда не требовали, чтобы этот конструктор выполнялся во всех случаях - но это привело бы к еще большей путанице. (Или, по крайней мере, поэтому я считаю, что аргумент идет.)
РЕДАКТИРОВАТЬ: Чтобы использовать ваш пример, что бы вы хотели, чтобы произошло, когда кто-то сделал:
Rational[] fractions = new Rational[1000];
Должен ли он проходить через ваш конструктор 1000 раз?
- Если нет, мы получаем 1000 недействительных рациональных аргументов
- Если это так, то мы можем напрасно потратить кучу работы, если собираемся заполнить массив реальными значениями.
EDIT: (отвечая немного больше на вопрос) Конструктор без параметров не создается компилятором. Типы значений не обязательно должны иметь конструкторы в отношении CLR - хотя оказывается, что может , если вы пишете это в IL. Когда вы пишете "new Guid()
" в C #, это излучает другой IL, чем вы получаете, если вы вызываете обычный конструктор. См. этот SO вопрос , чтобы узнать больше об этом аспекте.
Я подозреваю , что в структуре нет никаких типов значений с конструкторами без параметров. Без сомнения, NDepend мог бы сказать мне, если бы я спросил это достаточно хорошо ... Тот факт, что C # запрещает это, является достаточно большим намеком, чтобы я подумал, что это, вероятно, плохая идея.