> 技术文档 > C# 泛型(泛型方法)

C# 泛型(泛型方法)


泛型方法

与其他泛型不一样,方法是成员,不是类型。泛型方法可以在泛型和非泛型类以及结构和接
口中声明,如图18-10所示。

C# 泛型(泛型方法)

声明泛型方法

泛型方法具有类型参数列表和可选的约束。

  • 泛型方法有两个参数列表。
    • 封闭在圆括号内的方法参数列表。
    • 封闭在尖括号内的类型参数列表。
  • 要声明泛型方法,需要:
    • 在方法名称之后和方法参数列表之前放置类型参数列表;
    • 在方法参数列表后放置可选的约束子句。

C# 泛型(泛型方法)

说明 记住,类型参数列表在方法名称之后,在方法参数列表之前。

调用泛型方法

要调用泛型方法,应该在方法调用时提供类型实参,如下所示:

C# 泛型(泛型方法)
图18-11演示了一个叫作DoStuff的泛型方法的声明,它接受两个类型参数。其后是两次方
法调用,每使用不同的类型参数。编译器使用每个构造实例产生方法的不同版本,如图18-11中
右边所示。

C# 泛型(泛型方法)

推断类型
如果我们为方法传入参数,编译器有时可以从方法参数的类型中推断出应用作泛型方法的类
型参数的类型。这样就可以使方法调用更简单,可读性更强。
例如,下面的代码声明了MyMethod,它接受了一个与类型参数同类型的方法参数。

C# 泛型(泛型方法)

如以下代码所示,如果我们使用int类型的变量调用MyMethod,方法调用中的类型参数的信
息就多余了,因为编译器可以从方法参数中得知它是int。

C# 泛型(泛型方法)

由于编译器可以从方法参数中推断类型参数,我们可以省略类型参数和调用中的尖括号,如
下所示。

MyMethod(myInt)

泛型方法的示例
如下的代码在一个叫作Simple的非泛型类中声明了一个叫作ReverseAndPrint的泛型方法。
这个方法把任意类型的数组作为其参数。Main声明了3个不同的数组类型,然后使用每一个数组
调用方法两次。第一次使用特定数组调用了方法,并显式使用类型参数,而第二次让编译器推断
类型。

class Simple //非泛型类{ static public void ReverseAndPrint<T>(T[] arr) //泛型方法 { Array.Reverse(arr); foreach(T item in arr)  //使用类型实例T Console.Write($\"{item.ToString()},\"); Console.WriteLine(\"\"); }}class Program{ static void Main() { //创建各种类型的数组 var intArray =new int[]{3,5,7,9,11}; var stringArray=new string[]{\"first\",\"second,\"third\"}; var dooubleArray=new double[] {3.567,7,891,2.345}; Simple.ReverseAndPrint<int>(intArray); //调用方法 Simple.ReverseAndPrint(intArray); //推断类型并调用 Simple.ReverseAndPrint<string>(stringArray); //调用方法 Simple.ReverseAndPrint(stringArray); //推断类型并调用 Simple.ReverseAndPrint<double>(doubleArray); //调用方法 Simple.ReverseAndPrint(doubleArray);  //推断类型并调用 }}