Ho incontrato lo strano comportamento del generico. Di seguito è riportato il codice che utilizzo per il test.Comportamento strano generico
public static class Program
{
public static void Main()
{
Type listClassType = typeof(List<int>).GetGenericTypeDefinition();
Type listInterfaceType = listClassType.GetInterfaces()[0];
Console.WriteLine(listClassType.GetGenericArguments()[0].DeclaringType);
Console.WriteLine(listInterfaceType.GetGenericArguments()[0].DeclaringType);
}
}
uscita:
System.Collections.Generic.List`1[T]
System.Collections.Generic.List`1[T]
ho trovato molto strano che la seconda chiamata Console.WriteLine viene visualizzata una classe, non un'interfaccia, perché io uso una definizione di tipo generico. È corretto questo comportamento?
Sto cercando di implementare inferenze di tipo generico nel mio compilatore. Supponiamo che io abbia il codice qui sotto.
public static class GenericClass
{
public static void GenericMethod<TMethodParam>(IList<TMethodParam> list) { }
}
e voglio chiamare questo metodo come segue:
GenericClass.GenericMethod(new List<int>());
Al fine di verificare la possibilità di inferenza, devo confrontare il tipo nella firma del metodo, e il tipo di argomenti passati. Ma il codice sottostante restituisce false.
typeof(GenericClass).GetMethods()[0].GetParameters()[0].ParameterType == listInterfaceType;
importante usare sempre Type.GetGenericTypeDefinition per questi confronti?
Beh, in ogni caso, che si riforniscono la catena chiamata dalla lista generica non legato, in modo che il tipo di dichiarazione che sarà sempre di tipo generico non legato. Cosa stai cercando di fare? –
JerKimball