Таким образом, он закрывается с использованием несуществующего типа имени «T», и только выполнение GetGenericTypeArgument на нем заставляет его снова открываться. Почему это?
Потому что это один аргумент типа при условии, - параметр типа для B
.
Посмотрите на то, как вы указываете базовый класс:
public class B<T> : A<T>
Что в A<T>
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
}
}
Класс 'System.Type' не имеет метод с именем' GetGenericTypeArguments'. Вы имели в виду 'GetGenericArguments'? – Wazner
@ Wazner: yup, исправлено. –
https://dotnetfiddle.net/n6jJ4A - Я получаю 0 и 1. –