2010-10-23 4 views
6

Если нет, и множество ссылочных типов и типов значений являются взаимоисключающими, почему это не компиляции:Может ли тип быть ссылочным типом и типом значения одновременно?

public static void Do<T>(T obj) where T : struct { } 
public static void Do<T>(T obj) where T : class { } 

Компилятор гласит: «Тип уже определяет элемент под названием„Do“с теми же типами параметров . ", но T и T здесь не совпадают. Один из них связан с структурами, другой - с ограничениями на классы. Вызов функции всегда должен быть разрешимым. Есть ли встречные примеры?

+0

Фактически, каждый из них ограничен «ссылочными типами» (который включает в себя делегаты, интерфейсы и т. Д., А не только классы), а другой ограничивается структурами **, кроме ** 50% (возможных) структур, которые задействованы в 'Nullable '. Эти ограничения в настоящее время не позволяют, например, «T === int?». –

ответ

3

Общие ограничения не принимаются как часть соответствия перегрузки. Это то же самое, что и тип возврата.

Например, это приведет к тем же ошибкам (Перегрузки отличаются только типом возвращаемого значения):

public static int Do<T>(T obj) { } 
public static bool Do<T>(T obj) { } 

В обеих этих случаях, правила согласования перегрузки принимают во внимание только типов параметров, игнорируя дополнительную информацию, такую ​​как ограничения и тип возврата.

1

Нет, типы никогда не могут быть обоими. Код не работает, потому что общие параметры (<T>, то есть не T obj) не имеют понятия «перегрузки». Также нет ничего похожего на специализированную специализацию на C++.

+0

Хотя вы могли бы связать вещи в узлах над бокс-типами значений;) –

Смежные вопросы