记录C#泛型
常见的泛型类型
泛型类
class MyClass<T>
{
//......
} 泛型接口
interface GenericInterface<T>
{
void GenericMethod(T t);
} 泛型方法
public void MyGenericMethod<T>()
{
//......
} 泛型数组
public T[] GenericArray; 泛型委托
public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input); 泛型结构
struct MyGenericStruct<T>
{ }
泛型约束
| 约束 | 说明 |
| T:结构 | 类型参数必须是值类型 |
| T:类 | 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。 |
| T:new() | 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 |
| T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
| T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 |
1、基类约束
/// <summary>
/// 基类约束:约束T必须是People类型或者是People的子类
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tParameter"></param>
public static void Show<T>(T tParameter) where T : People
{
Console.WriteLine($"{tParameter.Id}_{tParameter.Name}");
Parameter.Hi();
}
注意:
基类约束时,基类不能是密封类,即不能是sealed类。sealed类表示该类不能被继承,在这里用作约束就无任何意义,因为sealed类没有子类。
2、接口约束

/// <summary>
/// 接口约束
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="t"></param>
/// <returns></returns>
public static T Get<T>(T t) where T : ISports
{
t.Pingpang();
return t;
}

3、引用类型约束 class
引用类型约束保证T一定是引用类型的。

1 /// <summary>
2 /// 引用类型约束
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="t"></param>
6 /// <returns></returns>
7 public static T Get<T>(T t) where T : class
8 {
9 return t;
10 }

4、值类型约束 struct
值类型约束保证T一定是值类型的。

1 /// <summary>
2 /// 值类型类型约束
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="t"></param>
6 /// <returns></returns>
7 public static T Get<T>(T t) where T : struct
8 {
9 return t;
10 }

5、无参数构造函数约束 new()

1 /// <summary>
2 /// new()约束
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="t"></param>
6 /// <returns></returns>
7 public static T Get<T>(T t) where T : new()
8 {
9 return t;
10 }

泛型约束也可以同时约束多个,例如:

1 public static void Show<T>(T tParameter)
2 where T : People, ISports, IWork, new()
3 {
4 Console.WriteLine($"{tParameter.Id}_{tParameter.Name}");
5 tParameter.Hi();
6 tParameter.Pingpang();
7 tParameter.Work();
8 }

注意:有多个泛型约束时,new()约束一定是在最后。
转载:https://www.cnblogs.com/dotnet261010/p/9034594.html
转载:https://blog.csdn.net/kebi007/article/details/77800954
记录C#泛型的更多相关文章
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- 学习记录 java泛型资料
java泛型资料: 1. 概述在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型.例如原先的类型List,现在在细分成Lis ...
- 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的
数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...
- C#中的记录(record)
从C#9.0开始,我们有了一个有趣的语法糖:记录(record) 为什么提供记录? 开发过程中,我们往往会创建一些简单的实体,它们仅仅拥有一些简单的属性,可能还有几个简单的方法,比如DTO等等,但是这 ...
- C# 调用 Oracle
C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...
- .net C# SqlHelper for Oracle
适用于Oracle的sqlhelper 需要使用ODP.Net,引用Oracle.DataAccess.dll 推荐安装ODAC 代码如下: using System; using System.Co ...
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- 前端入门25-福音 TypeScript
声明 本篇内容摘抄自以下来源: TypeScript 中文网 只梳理其中部分知识点,更多更详细内容参考官网. 正文-TypeScript 今天来讲讲有 Java 基础转 JavaScript 的福音: ...
- MyBatis3系列__05查询补充&resultMap与resultType区别
1.查询补充 当你查询一条记录并且是简单查询时,情况相对简单,可以参考以下的例子: public Employee getEmpById(Integer id); 对应的xml文件中: <sel ...
随机推荐
- Add a Simple Action using an Attribute 使用特性添加简单按钮
In the previous Add a Simple Action lesson, you learned how to add an Action by implementing the Vie ...
- xip.io
gg gg "" "" ,gg, ,gg gg gg,gggg, gg ,ggggg, ""8b,dP" 88 I8P" ...
- 在Ubuntu上安装Miniconda
在Ubuntu上安装Miniconda Anaconda是一个开源的Python包管理器,而Miniconda则是轻量级的Anaconda 下载地址:https://docs.conda.io/en/ ...
- CheckBoxList选中某项,获取其它项是否是选中
<div class="formControls col-xs-8 col-sm-9" style="margin-top:-15px;" id=&quo ...
- python接口自动化根据请求接口类型进行封装
根据不同的请求类型(GET/POST)进行接口请求封装 import requests import json class RunMain: def __init__(self, url, metho ...
- new String(request.getParameter("userID").trim().getBytes("8859_1"))的含义是什么?
new String(request.getParameter("userID").trim().getBytes("8859_1")) request.get ...
- KVM使用总结
目录 一.虚拟化介绍 二.通过kvm安装centos7系统 三.常用操作 虚拟机列表 开关机 导出虚拟机 重命名 挂起&恢复 查看某个虚拟机对应的端口 kvm开机启动 console登陆(失败 ...
- 《3D_Deep_Learning_for_Robot_Perception.pdf》
https://github.com/PrincetonVision/marvin
- VIJOS-P1013 强墙
JDOJ 1198: VIJOS-P1013 强墙 JDOJ传送门 Description 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口 ...
- 自己收集的好玩的JS特效(持续更新)
放到我自己的服务器上了. 网 scale.html 樱花 sakura.html