Ответ 1
Поэтому он закрывается с использованием несуществующего типа имени "T", и только выполнение GetGenericTypeArgument на нем заставляет его снова открываться. Почему это?
Поскольку имеется один аргумент типа - параметр типа B
.
Посмотрите, как вы указываете базовый класс:
public class B<T> : A<T>
Что такое T
в A<T>
, если это не аргумент типа? Просто потому, что аргумент типа сам по себе является параметром типа, не означает, что он не указывается как аргумент типа.
Рассмотрим это:
public class A<T1, T2> { }
public class B<T> : A<T, int> { }
Здесь базовый класс B<T>
равен A<T, int>
- и вы можете определить, что int
был указан, запросив аргументы типа. Вы также можете показать, откуда приходит T
:
using System;
using System.Reflection;
using System.Collections.Generic;
public class A<T1, T2> { }
public class B<T> : A<T, int> { }
class Program
{
static void Main()
{
var bT = typeof(B<>).GetTypeInfo().GenericTypeParameters[0];
var listT = typeof(List<>).GetTypeInfo().GenericTypeParameters[0];
var bBaseArguments = typeof(B<>).BaseType.GenericTypeArguments;
Console.WriteLine(bBaseArguments[0] == bT); // True
// Shows that the T from B<T> isn't the same as the T from List<T>
Console.WriteLine(bBaseArguments[0] == listT); // False
Console.WriteLine(bBaseArguments[1] == typeof(int)); // True
}
}