C# 泛型

在定义类或方法的时候,不清楚调用者会使用那种类型的参数,则可以先定义为泛型类型,在调用的时候再指定其类型

泛型分为泛型方法和泛型类,泛型方法的定义语法如下

void 方法名<泛型列表>()
{
    // 方法体
}

泛型类的定义语法如下

public class 类名<泛型列表>
{
        // 类体
}

泛型列表每个参数类型用 “,” 逗号隔开。

在程序中,泛型就是一个类型,只要是在类中定义了,就可以像使用普通类型一样使用

static void Method1<T>(T str)
{
    Console.WriteLine("Method1:" + str);
}
Method1<string>("123");
--> 123
Method1<int>(12345);
--> 12345
Method1<bool>(false);
--> false
Method1<bool>(1==1);
--> true

根据调用者指定的类型不同,可以使用不同的参数,如果指定了string类型,但是参数不带“”双引号,就会报错

使用泛型类与使用泛型方法一致

public class Class1<T>{
    public void Method1(T str)
    {
        Console.WriteLine("参数为:" + str);
    }
}
Class1<string> c = new Class1<string>();
c.Method1("fsa");
--> fsa
Class1<int> c1 = new Class1<int>();
c1.Method1(123);
--> 123

因为在类中声明了泛型所以方法中可以直接使用

泛型也可以指定条件,比如这个类型只可以是stirng或者int这两个其中一个,其他类型不可以

指定条件语法如下

void 方法名<泛型列表>() where 泛型参数 : int,class之类的类型
{
    // 方法体
}

泛型类的定义语法如下

public class 类名<泛型列表>where 泛型参数 : int,class之类的类型
{
  // 类体
}

具体条件可以参考下面的表格

约束描述
where T: struct 类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。 有关详细信息,请参阅使用可以为 null 的类型
where T : class 类型参数必须是引用类型;这同样适用于所有类、接口、委托或数组类型。
where T : new() 类型参数必须具有公共无参数构造函数。 与其他约束一起使用时,new() 约束必须最后指定。
where T :<基类名> 类型参数必须是指定的基类或派生自指定的基类。
where T :<接口名称> 类型参数必须是指定的接口或实现指定的接口。 可指定多个接口约束。 约束接口也可以是泛型。
where T : U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。
原文地址:https://www.cnblogs.com/sunhouzi/p/12300061.html