C# 为什么IsGenericTypeDefinition返回false?

C# 为什么IsGenericTypeDefinition返回false?,c#,reflection,C#,Reflection,我试图理解类型的属性IsGenericTypeDefinition。据我所知,它只是一个没有任何替换类型的类模板(我们不能创建这个类的实例)。以下是我的测试程序代码: class Test { public class MyList<T> : List<T> { } public static void Main() { Console.WriteLine(typeof(MyList<>).GetMethod("

我试图理解类型的属性
IsGenericTypeDefinition
。据我所知,它只是一个没有任何替换类型的类模板(我们不能创建这个类的实例)。以下是我的测试程序代码:

class Test
{
    public class MyList<T> : List<T>
    {
    }
    public static void Main()
    {
    Console.WriteLine(typeof(MyList<>).GetMethod("Add").DeclaringType.IsGenericTypeDefinition);
    }
}
类测试
{
公共类MyList:列表
{
}
公共静态void Main()
{
Console.WriteLine(typeof(MyList).GetMethod(“Add”).DeclaringType.IsGenericTypeDefinition);
}
}

为什么程序打印
false
?我只是从泛型类型定义中获取此方法信息。为什么它没有泛型声明类型定义?是bug吗?

因为本例中的
DeclaringType
是属于
MyList
的泛型类型参数
T
List
的实例化

要获取未实例化的泛型类型,您需要使用
GetGenericTypeDefinition
,它将返回
List

typeof(MyList).GetMethod(“Add”).DeclaringType.GetGenericTypeDefinition()
钻得更深一点,我们得到:

var instantiationListArgs = typeof(MyList<>).GetMethod("Add").DeclaringType.GetGenericArguments();
var myListArg = typeof(MyList<>).GetGenericArguments();
var listArgs = typeof(List<>).GetGenericArguments();
Console.WriteLine(myListArg[0] == instantiationListArgs[0]); // Will output true, List was instantiated for the T in MyList
Console.WriteLine(listArgs[0] == instantiationListArgs[0]); // Will be false. The generic argument is different then the T in the free List<>
var instantiationListArgs=typeof(MyList).GetMethod(“Add”).DeclaringType.GetGenericArguments();
var myListArg=typeof(MyList).GetGenericArguments();
var listArgs=typeof(List).GetGenericArguments();
Console.WriteLine(myListArg[0]==实例化ListArgs[0]);//将输出true,列表已为MyList中的T实例化
Console.WriteLine(listArgs[0]==实例化listArgs[0]);//这将是错误的。泛型参数与自由列表中的T不同

因为本例中的
DeclaringType
是属于
MyList
的泛型类型参数
T
List
的实例化

要获取未实例化的泛型类型,您需要使用
GetGenericTypeDefinition
,它将返回
List

typeof(MyList).GetMethod(“Add”).DeclaringType.GetGenericTypeDefinition()
钻得更深一点,我们得到:

var instantiationListArgs = typeof(MyList<>).GetMethod("Add").DeclaringType.GetGenericArguments();
var myListArg = typeof(MyList<>).GetGenericArguments();
var listArgs = typeof(List<>).GetGenericArguments();
Console.WriteLine(myListArg[0] == instantiationListArgs[0]); // Will output true, List was instantiated for the T in MyList
Console.WriteLine(listArgs[0] == instantiationListArgs[0]); // Will be false. The generic argument is different then the T in the free List<>
var instantiationListArgs=typeof(MyList).GetMethod(“Add”).DeclaringType.GetGenericArguments();
var myListArg=typeof(MyList).GetGenericArguments();
var listArgs=typeof(List).GetGenericArguments();
Console.WriteLine(myListArg[0]==实例化ListArgs[0]);//将输出true,列表已为MyList中的T实例化
Console.WriteLine(listArgs[0]==实例化listArgs[0]);//这将是错误的。泛型参数与自由列表中的T不同

可能是因为Add method不是泛型的,但类列表是泛型的。Add方法只使用泛型参数类型作为参数,但方法本身没有定义它。可能是因为Add方法不是泛型的,但类列表是。Add方法只使用泛型参数类型作为参数,但方法本身没有定义它。这对我来说似乎很奇怪。我认为列表的类型定义过于泛化。现在看来是的not@LmTinyToon添加了更多的代码,也许它会清除一点,你不能继承一个未实例化的泛型,你可以继承
List
例如,在你的例子中,实例化恰好是另一个泛型参数,根本不需要涉及方法-以下是
typeof(MyList).BaseType!=typeof(List)
。基本上,这个问题与@IvanStoev的问题是重复的,关于
typeof(MyList).BaseType!=typeof(List)
就内容而言,这是您所指出问题的重复。相同的基本思想,但我相信这个问题仍然有价值,搜索这个特定案例您永远不会碰到引用的问题,有人可能会碰到这个问题one@TitianCernicova-德拉戈米尔:当然。这就是为什么我要发表评论而不是欺骗哈默宁g:)这对我来说似乎很奇怪。我认为列表的类型定义过于泛化。现在看来是的not@LmTinyToon添加了更多的代码,也许它会清除一点,你不能继承一个未实例化的泛型,你可以继承
List
例如,在你的例子中,实例化恰好是另一个泛型参数,根本不需要涉及方法-以下是
typeof(MyList).BaseType!=typeof(List)
。基本上,这个问题与@IvanStoev的问题是重复的,关于
typeof(MyList).BaseType!=typeof(List)
就内容而言,这是您所指出问题的重复。相同的基本思想,但我相信这个问题仍然有价值,搜索这个特定案例您永远不会碰到引用的问题,有人可能会碰到这个问题one@TitianCernicova-德拉戈米尔:当然。这就是为什么我要发表评论而不是欺骗哈默宁g it:)