CLR via C# 泛型 泛型方法

那年仲夏 提交于 2020-01-24 05:45:52

定义泛型类、结构或接口时,类型中定义的任何方法都可引用类型指定的类型参数。类型参数可作为方法参数、方法返回值或方法内部定义的局部变量的类型使用。然而,CLR还允许方法指定它自己的类型参数。这些参数也可作为参数、返回值或局部变量的类型使用。

在上面例子中,GenericType类定义了类型参数T,Converter方法也定义了自己的类型参数TOutput。这样的GenericType可以处理任意类型。Converter方法能将m_value字段引用的对象转换成任意类型----具体取决于调用时传递的类型实参是什么。泛型方法的存在,为开发人员提供了极大的灵活性。

泛型方法的一个很好地例子就是Swap方法:

为获取out和ref参数的方法使用泛型类型很有意思,因为作为out/ref实参传递的变量必须具有与方法参数相同的类型,以防止损害类型安全性。

//--泛型方法和类型推断

C#泛型语法因为涉及大量“<”和“>”符号,所以开发人员很容易被弄得晕头转向。为了改进代码的创建,增强可读性和可维护性,C#编译器支持在调用泛型方法时进行类型推断。这意味着编译器会在调用泛型方法时自动判断(或者说推断)要使用的类型。

//--

类型可定义多个方法,让其中一个方法接受具体数据类型,让另一个接受泛型数据类型:

举例:

在第一个调用中,编译器可调用一个接受string参数的Display方法,也可调用泛型Display<T>(T o)(方法将T替换成string)。但是C#编译器的策略是先考虑较明确的匹配,再考虑泛型匹配。所以,它会生成对非泛型Display方法的调用。

对于第二个调用,编译器不能调用接受string参数的非泛型Display方法,所以必须调用泛型Display<T>(T o)方法。

编译器优先选择较明确的匹配,开发人员应对此感到庆幸。假如编译器优先选择泛型方法,那么由于泛型Display方法会再次调用Display(但传递string),所以会造成无限递归。

对于第三个调用,明确指定了泛型类型实参string。这告诉编译器不要尝试推断类型实参。相反,应使用显式指定的类型实参。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!