В разных местах имеет смысл с точки зрения согласованности думать о типах значений как о конструкторе без параметров. Вы всегда можете создать значение, не предоставляя никаких аргументов, и это верно как для 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 # будет иногда использовать его (и иногда нет) в зависимости от контекста. Подробнее см. в моем блоге .