Рассмотрим следующий универсальный метод:
public T2 Frob<T1, T2>(T1 item)
where T1 : class, T2
=> item as T2;
Компилятор откажется компилировать этот код; Параметр типа 'T2' нельзя использовать с оператором 'as', потому что он не имеет ограничения типа класса или ограничения 'class'
Хорошо, это легко решить, просто выполнив:
public T2 Frob<T1, T2>(T1 item)
where T1 : class, T2
where T2 : class
=> item as T2;
Но разве это не лишнее? Есть ли возможный T2
, который не является class
, учитывая ограничения, уже существующие для T1
?
У меня вопрос не в том, почему этот «вывод» не был реализован в компиляторе, причиной может быть просто «никто об этом не подумал», и это нормально. Мне больше интересно знать, верны ли мои рассуждения в том, что T2
эффективно и во всех случаях ограничивается значением class
в первом примере, даже если это явно не применяется.
T1
применяются также и дляT2
? У них нет ничего общего, в частности, хотяT1
происходит отT2
,T2
не знает ничего оT1
. - person HimBromBeere   schedule 13.02.2017T2
ничем не ограничен, это может быть дажеstruct
. - person HimBromBeere   schedule 13.02.2017T1
. - person InBetween   schedule 13.02.2017T2
не может быть типом значения, потому чтоT1
не может быть производным от типа значения. Так что это обязательно должен быть ссылочный тип. - person René Vogt   schedule 13.02.2017