3.13C#语言的泛型(Generic)

1.泛型类

类型参数跟在类名后面。

class 类名<类型参数>
{
    //类体
}

2.泛型接口

类型参数跟在接口名后面。

interface I接口名<类型参数> 
{
    //接口体
}

3.泛型方法

类型参数跟在方法名后面。

返回类型 方法名<类型参数>(类型 形参) 
{
    //方法体
}

方法调用时,可以根据实参推断出类型参数的类型,无需显式指定。

方法名<类型参数>(实参)
方法名(实参)

4.构造(Constructed)类型

封闭式构造(closed constructed)类型:指定类型参数,例如,Node<int>

开放式构造(open constructed)类型:未指定类型参数,例如,Node<T>

泛型类可继承自封闭式构造或开放式构造基类。

非泛型类(即,具体类)可继承自封闭式构造基类,但不可继承自开放式构造类,因为运行时客户端代码无法提供实例化基类所需的类型参数。

5.类型参数的约束

通过使用 where 上下文关键字指定约束。

约束描述
where T : struct类型参数必须是 非Nullable 的值类型。struct 约束不能与 new() 约束结合使用,也不能与 unmanaged 约束结合使用。
where T : class类型参数必须是 非Nullable 的引用类型。此约束还应用于任何类、接口、委托或数组类型。
where T : class?类型参数必须是 Nullable 或 非Nullable 的引用类型。此约束还应用于任何类、接口、委托或数组类型。
where T : notnull类型参数必须是 非Nullable 的类型。
where T : default重写方法或提供显式接口实现时,如果需要指定不受约束的类型参数,此约束可解决歧义。 default 约束表示基方法,但不包含 class 或 struct 约束。
where T : unmanaged类型参数必须是 非Nullable 的非托管类型。unmanaged 约束表示 struct 约束,且不能与 struct 约束或 new() 约束结合使用。
where T : new()类型参数必须具有public无参数构造函数。 与其它约束一起使用时,new() 约束必须最后指定。 new() 约束不能与 struct 和 unmanaged 约束结合使用。
where T : 基类名类型参数必须是指定的基类或派生自指定的基类。T 必须是从指定基类派生的 非Nullable 的引用类型。
where T : 基类名?类型参数必须是指定的基类或派生自指定的基类。T 可以是从指定基类派生的 Nullable 或 非Nullable 的类型。
where T : 接口名类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。T 必须是实现指定接口的 非Nullable 的类型。
where T : 接口名?类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。T 可以是 Nullable 的引用类型、非Nullable 的引用类型、值类型。 T 不能是Nullable 的值类型。
where T : U为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。如果 U 是 非Nullable 的引用类型,T 必须是 非Nullable 的引用类型。如果 U 是 Nullable 的引用类型,则 T 可以是 Nullable 的引用类型,也可以是 非Nullable 的引用类型。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/13549.html

(0)
上一篇 2021年3月12日 00:51
下一篇 2021年3月14日 21:18

相关推荐

  • 2.6C#函数成员之索引器(Indexer)

    1.索引器声明 索引器的声明方式与属性相似,格式为索引器名称 this 后跟 分隔符 [ 和 ] 以及单个或多个参数。 2.访问器 类似于属性,索引器分为读写、只读和只写索引器。 3.接口中的索引器 接口访问器不使用修饰符。 接口访问器通常没有实现,仅指示索引…

    C#语言教程 2021年2月6日
    02800
  • 2.2C#数据成员之常量(Constant)

    1.常量声明和初始化 const 字段只能在该字段的声明中初始化,不能用任何构造函数对其赋值,后期也不能修改其值。 常量是隐式的静态常量,所以声明时不需要使用 static 关键字。 常量值可以是C# 内置类型(包括数字、布尔、字符串、null等,不包括  System.Object),不…

    C#语言教程 2021年2月2日
    03160
  • 1.6C#语言的选择(Selection)、迭代(Iteration)、跳转(Jump)语句

    1.if选择 2.if-else选择 3.if-else-if-else选择 4.switch选择 default case 指定匹配表达式与其他任何 case 模式都不匹配时要执行的语句。 通常在每个 switch section末尾使用 break 语句将控制从 switch…

    C#语言教程 2021年1月6日
    04720

发表回复

登录后才能评论