我遇到了泛型的奇怪行为。下面是我用于测试的代码。
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);
}
}
输出:
System.Collections.Generic.List`1[T]
System.Collections.Generic.List`1[T]
我发现第二个 Console.WriteLine 调用显示一个类而不是接口很奇怪,因为我使用了泛型类型定义。这是正确的行为吗?
我正在尝试在我的编译器中实现泛型类型推断。假设我有下面的代码。
public static class GenericClass
{
public static void GenericMethod<TMethodParam>(IList<TMethodParam> list) { }
}
我想按如下方式调用此方法:
GenericClass.GenericMethod(new List<int>());
为了检查推理的可能性,我必须比较方法签名中的类型和传递的参数类型。但是下面的代码返回 false。
typeof(GenericClass).GetMethods()[0].GetParameters()[0].ParameterType == listInterfaceType;
我是否应该始终使用 Type.GetGenericTypeDefinition 进行此类比较?