В этом нет ничего плохого.Давайте посмотрим на определение ограничений на параметры типа :
T : class
- Аргумент типа T должен быть ссылочным типом, включая любой класс, интерфейс, делегат,или тип массива. U : struct
- Аргумент типа U должен быть типом значения. U : T
- Аргумент типа U должен быть или быть производным от класса T.
Итак, все, что вам нужно сделать, это найти тип значения, который является производным от ссылочного типа.Поначалу это может показаться невозможным, но если вы подумаете немного сложнее, вы помните, что все структуры происходят из класса object
, так что это прекрасно работает для обоих примеров:
new C<object, int>();
Однако, если вы поменялисьstruct
и class
, тогда он не скомпилируется:
// Error - Type parameter 'T' has the 'struct' constraint so 'T'
// cannot be used as a constraint for 'U'
class C<T, U>
where T : struct
where U : class, T
{
}