Объединение структурных и новых () ограничений общего типа - PullRequest
6 голосов
/ 19 ноября 2011

Имея в последнее время имел причину просмотреть документацию Nullable, я заметил, что определение Nullable выглядит так:есть открытый конструктор без параметров, если это правильно, что здесь добавляет ограничение типа new ()?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2011

Для структуры new не имеет смысла.Для классов это так.

В вашем случае это избыточно.

public T FactoryCreateInstance<T>() where T : new()
{
return new T();
}

Имеет смысл указать новое ограничение в случае, подобном выше, но не тогда, когда оно уже ограничено, чтобы быть структурой.

Конструктор без параметров для типов значений является ограничением C #, а не ограничением CLI.Возможно, именно поэтому указывается избыточно, чтобы оставить место для маневра на будущее.

1 голос
/ 18 сентября 2012

Просто отметив, что это действительный, проверяемый IL (т.е.

 .class public sequential ansi sealed StructNewStruct`1<valuetype .ctor ([mscorlib]System.ValueType) T>
     extends [mscorlib]System.ValueType

компилируется, как и простой

 .class public sequential ansi sealed StructNewStruct`1<valuetype .ctor T>
     extends [mscorlib]System.ValueType

), но у меня пока нет кода, который бы делал что-то другое для этого, что обеспечивает простой where T:struct (или (Of T As Structure) в VB.NET и <valuetype T> в IL).

В частности, структуры Nullable уже не допускаются ни для какого общего аргумента с простым ограничением struct. (Кажется, Nullable объекты являются классами почти для всех целей, кроме хранения.)

Итак, в итоге, текущий Nullable<T> (эквивалент) where T:ValueType, struct, new() в настоящее время, похоже, идентичен where T:struct.

Для вашей информации я использовал мой обновленный DotLisp, который позволяет создавать универсальные типы (просто используя MakeGenericType), чтобы попытаться создать тип StructNewStruct<t> и StructStruct<t> (*) для все вводит во всех сборках 4.0 Framework, которые загружаются без меня, пытаясь загрузить "необычные" сборки (например, System.Web, возможно, не были загружены). (Если есть какие-либо «специальные» типы в «неясных» сборках фреймворка, дайте мне знать, и я буду следить за тем, чтобы они были загружены и опробованы.) Все типы успешно или с ошибками одинаковы для обеих структур.

(*) StructStruct<T> where T:struct

1 голос
/ 19 ноября 2011

Он не должен иметь конструктор без параметров, и даже если он есть, он не должен быть общедоступным. Я считаю, что «new ()» требует, чтобы это имело обе эти вещи.

Редактировать: Да, согласно документации MSDN: "Новое ограничение указывает, что любой аргумент типа в объявлении универсального класса должен иметь конструктор public без параметров ."

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