C# (打开泛型类型)泛型类型的类型,未指定参数

C# (打开泛型类型)泛型类型的类型,未指定参数,c#,generics,reflection,C#,Generics,Reflection,有谁能用C语言解释一下,在没有指定具体参数的情况下,typeof(SomeGenericType)需要什么 我总结了以下示例: var t1 = typeof(Nullable<>); var t2 = typeof(Nullable<int>); var q = 1 as int?; var b1 = t1.IsInstanceOfType(q); //false var b2 = t2.

有谁能用C语言解释一下,在没有指定具体参数的情况下,
typeof(SomeGenericType
)需要什么

我总结了以下示例:

        var t1 = typeof(Nullable<>);
        var t2 = typeof(Nullable<int>);
        var q = 1 as int?;

        var b1 = t1.IsInstanceOfType(q); //false
        var b2 = t2.IsInstanceOfType(q); //true
var t1=typeof(可为空);
var t2=类型(可为空);
var q=1,表示整数?;
VarB1=t1.IsInstanceOfType(q)//假的
VarB2=t2.IsInstanceOfType(q)//真的
我最初认为
typeof(Nullable)
t2
更通用,后者指定了泛型参数
int
,但
b1
结果是
false
-所以
int?
的实例不是
Nullable
的实例

那么,应该如何将
b1
的变量定义为
true
?它有什么实际用途?

这是一种开放的泛型类型。
这不是一个实际的类型;不可能有该类型的实例

相反,您可以使用它生成具体的(封闭的)泛型类型,例如
Nullable

您还可以通过检查关闭泛型类型的
GetGenericTypeDefinition()
方法来检查它是否是特定打开泛型类型的实例

那么应该如何定义一个变量才能使b1为真呢

不可能。(事实上,使用
Nullable
时,无论如何都会遇到有趣的装箱问题,但我们开始了…)

在执行时,值始终是闭合类型的实例<代码>可空,
列表
是开放的泛型类型。在这样的类型上调用
IsInstanceOfType
是没有用的。但这并不意味着它毫无用处

通常在反射中使用开放类型。例如:

public IList CreateList(Type elementType)
{
    Type closedType = typeof(List<>).MakeGenericType(elementType);
    return (IList) Activator.CreateInstance(closedType);
}
public IList CreateList(类型elementType)
{
Type closedType=typeof(列表)。MakeGenericType(elementType);
return(IList)Activator.CreateInstance(closedType);
}
可以有属于泛型的高级别代码,但对低级别的调用会传递
类型
值-然后列表可以返回堆栈并转换为
IEnumerable
,以获得
T
的适当值

同样,您可能希望创建一个带有反射的封闭类型,以便对其调用方法,等等


您还可以使用它来确定特定类型是否为某些类型参数实现了泛型接口-对于每个实现的接口,您可以确定它是否是泛型的,获取泛型类型定义,并查看它是否等于(比如)
IEnumerable

“X比Y更泛型”不是同义词“Y是X的一个实例”。你能提供一个
开放泛型的实例吗
@glaucus:一个具体的实例吗?
typeof(List)
是一个开放泛型的实例。