C# 如果A<;T1、T2>;是实际类型的模板,那么为什么允许使用typeof(a<;,>;)? 类程序 { 静态void Main(字符串[]参数) { t型=A型; Console.WriteLine(typeof(A));//打印A'2[T1,T2] } } 甲级 { }
据我所知,泛型类型C# 如果A<;T1、T2>;是实际类型的模板,那么为什么允许使用typeof(a<;,>;)? 类程序 { 静态void Main(字符串[]参数) { t型=A型; Console.WriteLine(typeof(A));//打印A'2[T1,T2] } } 甲级 { },c#,generics,C#,Generics,据我所知,泛型类型A不是实际类型,而是实际类型的蓝图/模板,那么为什么typeof接受它作为参数(因为据我所知,typeof接受作为参数实际类型) 谢谢它被接受,因为它是一种通用类型 它是一个开放的泛型类型(它们的类型参数尚未指定),但它仍然是一个类型 请参阅讨论(什么是“开放泛型类型”) 和(类型): typeof运算符也可以用于打开的泛型类型 因为A是一个开放的泛型,它明确表示支持。在反射中,未构造的泛型类型,比如C与实例类型C合并 这也许比理论上更不纯粹;我认为这些是非常不同的实体。我认为
A
不是实际类型,而是实际类型的蓝图/模板,那么为什么typeof
接受它作为参数(因为据我所知,typeof
接受作为参数实际类型)
谢谢它被接受,因为它是一种通用类型 它是一个开放的泛型类型(它们的类型参数尚未指定),但它仍然是一个类型 请参阅讨论(什么是“开放泛型类型”) 和(类型): typeof运算符也可以用于打开的泛型类型 因为
A
是一个开放的泛型,它明确表示支持。在反射中,未构造的泛型类型,比如C
与实例类型C
合并
这也许比理论上更不纯粹;我认为这些是非常不同的实体。我认为其中一个是符号“带有一个类型参数的C”,另一个是编译时类型C
。在代码中,C
和C
不是同义词;如果T在范围内,则可以创建后一种类型的字段,但不能创建前一种类型的字段
但是,当您请求未构造类型时,反射库为您提供实例类型的类型并不完全是错误的。您将如何处理未构造的类型?你真的无能为力。但是对于实例类型,您可以在这里说“用int代替T” 当您请求
typeof(C)
时,获得C
的真正好处是,它总是为您提供未构造的类型。比较:
class Program
{
static void Main(string[] args)
{
Type t = typeof(A<,>);
Console.WriteLine(typeof(A<,>)); // prints A'2[T1,T2]
}
}
class A<T1,T2>
{
}
C类
{
公共静态类型CT(){return typeof(C);}
公共静态类型JustC(){return typeof(C);}
}
当你打电话给CT时,你打算怎么称呼它?没有可调用CT的类型C
。您可以调用C.CT
,在这种情况下,您将返回C
,而不是C
。获取用T构造的类型C
的唯一方法是请求typeof(C)
这有意义吗
我还没有谈到反思(我对它是什么有一个模糊的概念)
反射只是一个代码库,它允许您在代码本身中获取有关代码的信息。“typeof”为您提供了一个类型对象,您可以对该对象进行“反思”,以查找有关该类型的信息
我不确定我是否理解你所说的“即使T不在范围内”是什么意思
我说的方式让人困惑。我已经对它进行了重新表述。开放泛型类型和开放构造泛型类型之间有什么区别?@flockofcode-1。开放泛型类型是类型。在不提供类型参数的情况下无法实例化它们,但它们仍然是类型。2.开放构造类型是指至少一个泛型类型尚未指定的情况。请看这里:@flockofcode-1。为什么不呢?形式参数可以是开放构造的泛型类型。在运行时,您当然必须通过一个封闭的泛型类型。2.我想说,开放构造的泛型类型是开放泛型类型的子集。因此,一些开放构造的泛型类型也是开放泛型类型。@flockofcode您可以将开放泛型类型视为抽象类型-它是构造具体泛型类型的不可实例化的基础。@flockofcode-
public void MethodAccessException(OpenConstructed con){}
。形式参数是一种开放构造的泛型类型。您必须使用指定的第一个类型参数创建一个实例,并在-new OpenConstructed()
@Oded:您不能这样做,但您可以这样做:public void MethodAccessException(opencon){}
C#不像Java那样进行类型擦除,因此,当存在未确定的类型参数时,接受参数的方法在某种程度上也必须是泛型的(它同样可以是泛型类的成员)。1-“这有意义吗?”有点,但我还没有涉及反射(我对它有一个模糊的概念),我更倾向于愚蠢的一面。2-“真正的好处是,typeof(C)允许您在T不在范围内时获得C的type对象”我不确定我是否理解您所说的“即使T不在范围内”是什么意思?2-“当您请求未构造的类型时,反射库给您实例类型的类型并不完全是坏的。”我假设这里您不是在谈论typeof(A),因为这不会给您类型A的实例“当您请求未构造的类型时,反射库给您实例类型的类型并不都是坏的。”您使用的术语有点混乱。您说的是typeof(C)返回实例类型的类型,因此它返回C的类型,其中T尚未指定。因此,据我所知,您暗示C是实例类型,而据我所知,实例类型的所有类型参数都已确定?!@flockofcode:的确,术语非常混乱。规范定义了“泛型类型的“实例类型”,作为使用其类型参数构造的类型的编译时类型。例如,在类C{Cx;}编译时类型x是C-with-one-type-parameter的实例类型。x的运行时类型当然取决于替换为Tuhm的类型参数,我认为泛型类型的实例类型只是封闭构造泛型类型的另一个词,但是“x的编译时类型是C-with-one-type-parameter的实例类型。x的运行时类型当然取决于替换为T的类型参数case@flockofcode当前位置我指给你看s
class C<T>
{
public static Type CT() { return typeof(C<T>); }
public static Type JustC() { return typeof(C<>); }
}