Почему я не могу использовать System.ValueType как ограничение generics?
- Почему я не могу использовать ограничение
where T : System.ValueType
?
- Почему Microsoft предотвращает этот тип
от ограничения?
Пример:
Почему я не могу сделать следующее?
// Defined in a .Net class
public void bar<T>(T a) where T : ValueType {...}
// Defined in my class
public void foo<T>(T a) where T : ValueType
{ bar<T>(a); }
В чем разница в использовании структуры над ValueType?
// Defined in my class
public void foo<T>(T a) where T : struct
{ bar<T>(a); }
Ответы
Ответ 1
Существуют два различия между использованием
where T : struct
и
where T : ValueType
- последний мог бы
T
быть ValueType
сам, который является ссылочным типом.
- последний также разрешил бы
T
тип значения с нулевым значением
Первое из этих различий почти никогда не то, что вы хотите. Иногда это может быть полезно; Nullable<T>
немного нечетен тем, что он не удовлетворяет ни ограничению where T : struct
, ни where T : class
.
Более полезным было бы ограничение
where T : struct, System.Enum
который запрещен С# по какой-либо веской причине, которую я могу сказать. См. мой пост в блоге и Проект без привязки к мелодии для получения дополнительной информации о это.
Ответ 2
ValueType не является базовым классом типов значений, он просто представляет собой контейнер для значения, когда он помещается в коробку. Поскольку это класс контейнера, а не какой-либо иерархии для фактических типов, которые вы хотите использовать, это не полезно в качестве общего ограничения.
Ответ 3
Использование struct
в качестве общего ограничения функционально эквивалентно ограничению "ValueType". В .NET struct - это тип значения.