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

Поддерживает ли .Net кардиальные дженерики?

Предположим, что у нас есть вложенный обобщенный класс:

public class A<T> {
    public class B<U> { }
}

Здесь typeof(A<int>.B<>) - это, по существу, общий класс с двумя параметрами, в которых привязан только первый.

Если у меня есть один класс с двумя параметрами

public class AB<T, U> { }

Есть ли способ ссылаться на "AB с T=int и U оставаться открытым"? Если нет, это ограничение С# или ограничение CLR?

4b9b3361

Ответ 1

По-видимому, это невозможно сделать в С#, вы должны указать либо оба параметра типа, либо none.

И это тоже не поддерживается CLR, A<int>.B<> и A<string>.B<> относятся к одному типу:

Type t1 = typeof(A<int>).GetNestedType("B`1");
Type t2 = typeof(A<string>).GetNestedType("B`1");
// t1.Equals(t2) is true

Вложенным типом обоих типов является A<> (открытый общий тип)

EDIT: дальнейшее тестирование показывает, что typeof(A<int>.B<string>) на самом деле является типичным типом arity 2, а не вложенным родовым типом arity 1... typeof(A<int>.B<string>).GetGenericArguments() возвращает массив с typeof(int) и typeof(string). Таким образом, typeof(A<int>.B<>) фактически эквивалентен (A.B)<int, >, который не поддерживается (общий тип не может быть частично закрыт)

Ответ 2

Это то, что вы имеете в виду?

   class AB<T, U>
   {
      protected T t;
      U u;
   }

   class C<U> : AB<int, U>
   {
      public void Foo()
      {
         t = 5;
      }
   }