繁体   English   中英

C#泛型实现

[英]C# generics implementation

我是C#的新手,正试图在周末编写SNTP服务器。 在此开发过程中,我最终遇到了与以下问题完全相同的问题: 如何使用泛型将参数传递给非泛型方法?

这里重复的问题是:“如何使用泛型将参数传递给非泛型方法?” 这个问题的关键答案是,所讨论的非泛型方法没有接受对象的重载。

现在,我的问题是一个后续问题:为什么泛型以这种方式实现? 或者换个说法,为什么根本需要约束?

到目前为止,我的理解是泛型有助于保持编译时类型的安全性,这意味着编译器知道在编译时要处理的类型。

为什么没有实现C#(或者这个问题应该与CLR有关),以使编译器可以接受这样的事实,即正在创建一个通用类/方法,在该类/方法中可以提供一个在所有情况下都不可接受的参数。 然后,当调用通用类/方法get时,编译器可以看到问题并在那时抱怨。

这是技术限制吗?

似乎很遗憾,无法创建通用方法来包装具有多个重载的非通用方法。 除非我选择将类型检查推迟到运行时才能解决上述问题,否则我将不得不用一组方法包装此重载方法,每个方法一个签名,即使其中的代码看起来相同。 这将是利用通用方法的理想场所。

最能解释这一点的人是埃里克·利珀特(Eric Lippert),他做到了, 区别什么,第一部分:泛型不是模板

我们只做一次过载解析然后烘烤结果。 当某人(可能在完全不同的程序集中)使用字符串作为方法的类型参数时,我们不会在运行时更改它。 我们为泛型类型生成的IL已经选择了要调用的方法。 抖动并没有说“好吧,我碰巧知道,如果我们要求C#编译器立即使用此附加信息执行,那么它将选择其他重载。 让我重写生成的代码,以忽略C#编译器最初生成的代码……”抖动对C#的规则一无所知。

[...]

现在,如果您确实希望根据参数的运行时类型在运行时重新执行重载解析,则可以为您完成; 这就是C#4.0中新的“动态”功能。 只需将“对象”替换为“动态”,当您进行涉及该对象的调用时,我们将在运行时运行重载解析算法,并动态吐出调用编译器会选择的方法的代码,前提是它知道所有运行时类型在编译时。

那么为什么不呢:因为运行时不知道如何重新生成所需的代码。

关于某种设计哲学的观点是,您的代码应尽早(最好是在编译时)失败,但我现在找不到该报价。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM