Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果A<;T1、T2>;是实际类型的模板,那么为什么允许使用typeof(a<;,>;)? 类程序 { 静态void Main(字符串[]参数) { t型=A型; Console.WriteLine(typeof(A));//打印A'2[T1,T2] } } 甲级 { }_C#_Generics - Fatal编程技术网

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<>); }
}