接着上一篇幅,因为太长了不方便看。正好泛型方法本来也是一个常用到的技术,就单独拎出来讲好了。
泛型方法:
不仅接口、类和结构可以是泛型的,方法也可以是泛型的。在泛型方法中,泛型类型用方法声明来定义。泛型方法可以在泛型类型中定义。Swap<T>()方法把T定义为泛型类型,该类型用于两个参数金额一个变量temp:
void Swap<T>(ref T x, ref T y)
{
T temp;
temp = x;
x = yl
y = temp;
}
把泛型类型赋予方法的调用,就可以调用泛型方法:
int i = 4;
int j = 5;
Swap<int>(ref i, ref j);
但是,因为C#编译器会通过调用Swap()方法来获取参数的类型,所以不需要把泛型类型赋予方法调用。泛型方法可以像非泛型方法那样调用。比如:Swap(ref i, ref j); 这样调用,而不需要指定<int>。
需要的注意的是T只代表一种类型,例如:
class Program
{
static void Main(string[] args)
{
DDD(1,2);
DDD("nnioa", 3); // 编译器报错,无法确定T是哪一个类型。因为我们多个蚕食都用了同一个类型T,但是这里传过去的两个参数确是不一样的类型。
DDD(4.6, 5.6);
}
public static int DDD<T>(T x, T y)
{
return 1;
}
}
如果你是对于不同的参数类型进行的传值,那么你可以告诉编译器,你有不同的类型,比如:
class Program
{
static void Main(string[] args)
{
DDD(1,2);
DDD("nnioa", 1); // 这时候多类型为参数也不会报错
DDD(4.6, 5.6);
}
public static int DDD<T1,T2>(T1 x, T2 y)
{
return 1;
}
}
除了泛型类可以带约束,泛型方法同样是可以带有约束的。例如我们可以约束T1:
public class Class1
{
public Class1(double u)
{
k = u;
}
public Class1(string u)
{
i = u;
}
public static int x =10;
public int y = 11;
public string i = "AAA";
public static string j = "BBB";
public double k;
}
class Program
{
static void Main(string[] args)
{
DDD(Class1.x,2); // 报错,x是值类型,string是引用类型,报错信息提示没有装箱
DDD(Class1.j, 1);// 报错信息:没有从string到Class1的隐式转换
DDD(new Class1(3.1415928), 5.6);
}
// 我们给泛型方法做一个约束,约束T1必须是继承于Class1的
public static int DDD<T1,T2>(T1 x, T2 y) where T1:Class1
{
return 1;
}
}
我们接着谈带委托的泛型方法。