Я недавно считал, что C# и стандарты CLI определяют различные способы обработать типы значения и конструкторов.
Согласно спецификации CLI типы значения не могут иметь конструкторов без параметров, тогда как в значении спецификации C# типы имеют конструктора без параметров по умолчанию. Если, согласно спецификации CLI, необходимо создать стоимость, не указывая параметров, существует специальная инструкция сделать это с.
Таким образом, мои вопросы
В разных местах с точки зрения согласованности имеет смысл рассматривать типы значений как имеющие конструктор без параметров. Вы всегда можете создать значение без каких-либо аргументов, и это верно как для интерфейса командной строки, так и для C #. В C # вы можете просто использовать стандартный синтаксис конструктора:
int x = new int();
вместо того, чтобы использовать один синтаксис для этого и другой синтаксис для вызова «настоящего» конструктора.
Обратите внимание, что в C # 2 есть оператор значения по умолчанию, который, я полагаю, мог бы использовать вместо него:
int x = default(int);
Это действительно похоже на сгенерированный IL. Я полагаю, вполне возможно, что если бы у нас было это с самого начала, C # не стал бы «притворяться», что все типы значений имеют конструкторы без параметров.
С другой стороны, рассмотрите обобщенные типы:
public void Foo<T>() where T : new()
{
T t = new T();
}
Разрешено ли это для типов значений? Это - это - но если C # не разрешает new int ()
, тогда не имеет смысла разрешать его в общей форме ...
Один интересный момент вы можете захотеть взглянуть на него более подробно - хотя C # не позволяет вам определять конструктор без параметров настраиваемого типа значения, вы можете сделать это в IL, а C # будет иногда использовать его (а иногда и нет) в зависимости от по контексту. См. мою запись в блоге для более подробной информации .
тогда как в спецификации C# типы значений имеют конструктор по умолчанию без параметров
который вы не можете изменить. Так что эффект тот же, просто определен по-другому.