17.10 泛型方法

泛型方法是使用类型参数声明的方法,在这一点上和其他泛型类型一样,也可以对类型参数应用约束。只不过,和之前的泛型类型不同的是,方法是成员,而不是类型。泛型方法有它的使用场景,它可以声明在如下类型中:

❑泛型类以及非泛型类

❑结构

❑接口

要声明一个泛型方法,只需要在普通方法的基础上增加类型参数列表,将方法参数列表中的类型修改为类型参数即可,如图17-13所示。

17.10 泛型方法 - 图1

图 17-13 泛型方法的声明

在学习了如何声明泛型方法后,继续学习如何调用泛型方法,与泛型类型的使用方法很相似。例如,先定义一个泛型方法,如下所示:


public class MyPrinter

{

//泛型方法

public static TResult Print<T,TResult>(T msg)

where TResult:new()//约束

{

TResult result=new TResult();

return result;

}

}


然后调用这个静态的泛型方法:

17.10 泛型方法 - 图2

对于泛型方法,Visual Studio 2010的IntelliSense功能也可以进行提示,如图17-14所示。

17.10 泛型方法 - 图3

图 17-14 Visual Studio的代码提示功能对泛型方法的支持

在一些情况下,编译器可以根据传入的方法参数判断出类型参数的具体类型,此时就可以省略掉尖括号中的类型实参,如图17-15所示:

17.10 泛型方法 - 图4

图 17-15 泛型方法中基于编译器的类型推断

接下来,我们来看一个完整的例子,如代码清单17-12所示。

代码清单17-12 泛型方法的完整示例


namespace ProgrammingCSharp4

{

class Data

{

public Data()

{

System.Console.WriteLine(“Data类构造函数.”);

}

}

class GenericsSample

{

public static void Main()

{

MyPrinter.Print<int,Data>(2010);

MyPrinter.Print<string,Data>("hello world!");

}

}

public class MyPrinter

{

public static TResult Print<T,TResult>(T msg)

where TResult:new()

{

TResult result=new TResult();

return result;

}

}

}


上述代码的运行结果如下:


Data类构造函数.

Data类构造函数.