当前位置: 首页 > 编程语言 > C#

什么时候解析c#中的泛型类型?Share

时间:2023-04-10 16:03:42 C#

何时解析C#中的泛型类型?根据stackoverflow的这个答案,C#中的泛型类型在运行时解析。但是,根据此答案,在C#中,泛型类型在编译时解析。我在这里错过了什么?换句话说,类型T是在编译时还是运行时解析的?更新:根据Oded的回答,在这种情况下,类型是封闭的具体类型(意味着它将在编译时解析)}}publicclassTest{}将MSIL等同于classProgram{staticvoidMain(){vart=newTest();}}publicclassTest{}问题是问题没有得到妥善处理。两个人声称相反的事情:类型在运行时“解析”,而这些类型在编译时“解析”。既然相互矛盾,那么“解决”的意思肯定是不同的。我不知道“解析”类型是什么意思。但我确实知道什么是重载决议。当要求解析不涉及动态的重载时,C#编译器会根据有关泛型类型的编译时信息来确定在编译时调用哪个重载。例如,如果您有:staticvoidMain(){vard=newD();varp=newP();pN(d);//DisplaysInclassB}classB{publicvoidM()//注意,不是virtual{Console.WriteLine("InclassB");}}classD:B{publicnewvoidM()//new,不重载{Console.WriteLine("InclassD");}}classPwhereT:B{publicvoidN(Tt){tM();}}即使P被实例化为PN也总是调用BM。为什么?因为决定tM含义的重载决议问题必须在编译P.N时解决,而此时编译器最多知道t必须是B,所以它选择了BM。如果这不是“已解决”的意思,请澄清问题。您缺少开放和封闭泛型类型的概念。本质上,封闭泛型类型是指您实际在泛型参数上指定现有类型(或者它们由编译器推断)。例如:可空的nulInt;开放泛型类型是在运行时确定一个或多个泛型类型的类型(因此,Nullable类就是一个示例)。第一个答案是关于方法参数的,第二个是关于泛型类型参数的,这是你所缺少的。更准确地说:1.C#默认是静态类型的,因此在传递参数时,您将获得最合适的类型和方法。(另请参阅有关“动态”参数的回答。)2.通过C#语法设置泛型类型参数是关于静态类型的。通过反射设置它是另一回事。其他:“在.NET中”,每种类型在运行时首次使用时都有一个初始化阶段。(参见静态字段和静态构造函数)所以:所有类型都在运行时初始化,但静态类型(或动态...)在编译时使用,当需要“解析”时。开放类型(myclass)在运行时不存在。但是未绑定类型可以在运行时存在(myclass)。要在运行时解析未绑定类型,您需要使用typeof运算符。换句话说,除非使用typeof运算符,否则泛型类型在编译时会被关闭。以上就是C#学习教程:c#什么时候解析泛型?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: