Подтвердить что ты не робот

Почему я не могу использовать 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); }
4b9b3361

Ответ 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 - это тип значения.