.Net поддерживает карриновые дженерики? - PullRequest
18 голосов
/ 09 апреля 2011

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

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

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

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

public class AB<T, U> { }

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

Ответы [ 2 ]

10 голосов
/ 09 апреля 2011

Очевидно, что это не может быть сделано в C #, вы должны указать либо оба параметра типа, либо ни одного.

И, похоже, это не поддерживается 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<> (открытый универсальный тип)

РЕДАКТИРОВАТЬ: дальнейшее тестирование показывает, что typeof(A<int>.B<string>) на самом делеуниверсальный тип арности 2, не вложенный универсальный тип арности 1 ... typeof(A<int>.B<string>).GetGenericArguments() возвращает массив с typeof(int) и typeof(string).Так что typeof(A<int>.B<>) на самом деле эквивалентно (A.B)<int, >, что не поддерживается (универсальный тип не может быть частично закрыт) * ​​1021 *

3 голосов
/ 09 апреля 2011

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

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

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