C# 泛型(泛型方法)
泛型方法
与其他泛型不一样,方法是成员,不是类型。泛型方法可以在泛型和非泛型类以及结构和接
口中声明,如图18-10所示。
声明泛型方法
泛型方法具有类型参数列表和可选的约束。
- 泛型方法有两个参数列表。
- 封闭在圆括号内的方法参数列表。
- 封闭在尖括号内的类型参数列表。
- 要声明泛型方法,需要:
- 在方法名称之后和方法参数列表之前放置类型参数列表;
- 在方法参数列表后放置可选的约束子句。
说明 记住,类型参数列表在方法名称之后,在方法参数列表之前。
调用泛型方法
要调用泛型方法,应该在方法调用时提供类型实参,如下所示:
图18-11演示了一个叫作DoStuff的泛型方法的声明,它接受两个类型参数。其后是两次方
法调用,每使用不同的类型参数。编译器使用每个构造实例产生方法的不同版本,如图18-11中
右边所示。
推断类型
如果我们为方法传入参数,编译器有时可以从方法参数的类型中推断出应用作泛型方法的类
型参数的类型。这样就可以使方法调用更简单,可读性更强。
例如,下面的代码声明了MyMethod,它接受了一个与类型参数同类型的方法参数。
如以下代码所示,如果我们使用int类型的变量调用MyMethod,方法调用中的类型参数的信
息就多余了,因为编译器可以从方法参数中得知它是int。
由于编译器可以从方法参数中推断类型参数,我们可以省略类型参数和调用中的尖括号,如
下所示。
MyMethod(myInt)
泛型方法的示例
如下的代码在一个叫作Simple的非泛型类中声明了一个叫作ReverseAndPrint的泛型方法。
这个方法把任意类型的数组作为其参数。Main声明了3个不同的数组类型,然后使用每一个数组
调用方法两次。第一次使用特定数组调用了方法,并显式使用类型参数,而第二次让编译器推断
类型。
class Simple //非泛型类
{static public void ReverseAndPrint<T>(T[] arr) //泛型方法{Array.Reverse(arr);foreach(T item in arr) //使用类型实例TConsole.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); //推断类型并调用}
}