Почему я не могу использовать System.ValueType в качестве ограничения обобщений? - PullRequest
47 голосов
/ 06 декабря 2009
  • Почему я не могу использовать ограничение 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); }

Ответы [ 3 ]

65 голосов
/ 06 декабря 2009

Существует два различия между использованием

where T : struct

и

where T : ValueType
  • последний позволит T быть ValueType, что является ссылочным типом.
  • последнее также позволило бы T быть типом значения, допускающим значение NULL *

Первое из этих различий почти никогда не соответствует вашим ожиданиям. Второй может иногда быть полезным; Nullable<T> немного странно в том смысле, что не удовлетворяет ни ограничениям where T : struct, ни where T : class.

Более полезным было бы ограничение

where T : struct, System.Enum

, что запрещено C # без веской причины, которую я могу сказать. Подробнее см. в моем блоге и проекте Мелодия .

12 голосов
/ 06 декабря 2009

ValueType не является базовым классом типов значений, это просто контейнер для значения, когда оно упаковано. Поскольку это контейнерный класс, а не иерархия какого-либо типа для реальных типов, которые вы хотите использовать, он не используется в качестве общего ограничения.

6 голосов
/ 06 декабря 2009

Использование struct в качестве общего ограничения функционально эквивалентно ограничению «ValueType». В .NET структура является типом значения .

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