Каково различие между C# & CLI, когда это входит с типами значения и конструкторами?

Я недавно считал, что C# и стандарты CLI определяют различные способы обработать типы значения и конструкторов.

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

Таким образом, мои вопросы

  • почему разработчики C# намеренно отклонили бы из стандарта CLI - чем преимущество было там к этому, и почему CLI не позволяет эту функциональность?
  • в моем ограниченном опыте любое время я использую 'специальную инструкцию' допускать функциональность, которая не была первоначально предназначена, это обычно - определенный взлом. Как это отличается?
8
задан abatishchev 5 August 2010 в 09:57
поделиться

2 ответа

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

7
ответ дан 5 December 2019 в 21:15
поделиться

тогда как в спецификации C# типы значений имеют конструктор по умолчанию без параметров

который вы не можете изменить. Так что эффект тот же, просто определен по-другому.

0
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: