C#(六十二)之泛型的约束

类型约束

基类约束有两个重要的目的。

1:它允许在泛型类中使用有约束指定的基类成员。

2:确保只能使用支持指定基类或派生类的类型实例。

约束是使用 where 上下文关键字指定的。

下表列出了五种类型的约束:

约束

说明

T:struct

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。

T:class

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。

T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U   提供的参数或派生自为 U 提供的参数。这称为裸类型约束.

1:派生约束:

将约束定义在父类中,由其派生出的子类将受其约束。

(1):被约束类进行约束,列表list可以使用约束类中的成员。类型为 T 的所有项都保证是 基类对象或从 基类继承的对象

(2):实例化list的时候,尖括号<>中类型只能是基类或是其派生类的数据类型来实例化。

实例:

class Program
    {
        static void Main(string[] args)
        {
            // 只能使用animal 或者dog (基类或者其派生类) 这就是约束
            animalFamily<dog> cate = new animalFamily<dog>();
            cate.Add(new dog("aaa"));
            cate.Add(new dog("bbb"));
            cate.Add(new dog("ccc"));
 
            cate.Display();
 
            Console.ReadLine();
        }
    }
 
    /// <summary>
    /// 动物基类
    /// </summary>
    class animal
    {
        public string name;
        public animal(string nameValue)
        {
            name = nameValue;
        }
    }
 
    /// <summary>
    /// 狗类继承自动物类
    /// </summary>
    class dog : animal
    {
        public dog(string nameValue) :base(nameValue)
        {
           
        }
    }
 
    /// <summary>
    /// 动物家庭类,继承自动物类
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class animalFamily<T> where T : animal
    {
        public List<T> family = new List<T>();
        public void Add(T member)
        {
            family.Add(member);
        }
 
        public void Display()
        {
            foreach (T item in family)
            {
                Console.WriteLine(item.name);
            }
        }
   
    }

2:约束多个参数

可以对多个参数应用约束,并对一个参数应用多个约束,如下面的示例所示:

class Base { }
class Test<T, U>
    where U : struct
    where T : Base, new() { }

关于约束,先简单看到这里,以后再补充。

有好的建议,请在下方输入你的评论。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/41681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

chrome edge svg转png

chrome edge svg转png 生成SVG blockdiag Live Preview 导出png 截图&#xff1a; 左上角截取屏幕截图

Redis进阶底层原理 - 客户端集群方案

Redis集群一般来说会存在多个主节点&#xff0c;用于数据分区。对于客户端来说只会连接到某一个Redis主机节点。那客户端如果使用集群&#xff1f;方案如下&#xff1a; 原图地址&#xff1a;

2. CSS3的新特性

2.1 CSS3的现状 ●新增的CSS3特性有兼容性问题, ie9才支持 ●移动端支持优于PC端 ●不断改进中 ●应用相对广泛 ●现阶段主要学习: 新增选择器和盒子模型以及其他特性 CSS3给我们新增了选择器,可以更加便捷,更加自由的选择目标元素&#xff1a; 1.属性选择器 2.结构伪类选择器…

微信小程序源码反编译(wxss样式无法恢复的问题)

背景&#xff1a;从微信小程序源码上线后&#xff0c;网上一直有大神写程序来反编微信小程序的源码&#xff0c;不过现在来看基本都不能用了&#xff0c;有的能用也不能获取样式wxss文件&#xff0c;经过我的不懈努力&#xff0c;找到一些办法&#xff0c;接下来我会一步步讲。…

C\C++ 使用ping判断ip是否能连通

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; ping是一种用于测试网络连接的工具&#xff0c;它通过发送数据包到目标设备并等待其响应来工作&#xff0c;以检查网络是否连通。下面是例子. 效果&#xff1a; 代码…

简单认识框架

hi,大家好,好久不见今天为大家带来框架相关的知识 文章目录 &#x1f338;1.框架&#x1f95d;1.1为什么要学习框架 &#x1f338;2.框架的优点&#x1f95d;2.1采用servlet创建项目&#x1f440;2.1.1缺陷 &#x1f95d;2.2采用SpringBoot创建项目&#x1f440;2.2.1优势 &…

上市公司Git分支管理规范

Git分支管理策略 主分支Master 首先&#xff0c;代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本&#xff0c;都在这个主分支上发布。 Git主分支的名字&#xff0c;默认叫做Master。它是自动建立的&#xff0c;版本库初始化以后&#xff0c;默认就是在主…

Bring Your Data!Self- supervised Evolution of Large Language Models

Bring Your Data&#xff01;Self- supervised Evolution of Large Language Models IntroductionMethod参考 Introduction 这篇论文提出了一种自监督的评估方式来衡量大型语言模型的能力和局限性。常规的基于数据集的评估方式存在一些缺点: 需要不断新建数据集。存在数据集和…

SQL-每日一题【607.销售员】

题目 表: SalesPerson 表: Company 表: Orders 编写一个SQL查询&#xff0c;报告没有任何与名为 “RED” 的公司相关的订单的所有销售人员的姓名。 以 任意顺序 返回结果表。 查询结果格式如下所示。 示例&#xff1a; 解题思路 1.我们可以用子查询来解决这道题&#xff0c;…

试玩python的web框架 flask、fastapi、tornado、django

文章目录 一、Flask入门案例 [官网](https://flask.net.cn/quickstart.html) [其它参考](https://zhuanlan.zhihu.com/p/104273184?utm_id0)二、FastAPI入门案例 [官网](https://fastapi.tiangolo.com/zh/) [w3cschool教程](https://www.w3cschool.cn/fastapi/fastapi-feature…

Apikit 自学日记:私有云才有的测试文件库功能,该如何使用呢

在 APIkit 的私有云版本中&#xff0c;提供了测试文件库功能。不过目前该功能仅供私有云产品&#xff0c;线上SaaS产品不提供测试文件库功能 API自动化测试中可以添加文件参数。在这里统一管理所有测试文件。 在测试文件库界面&#xff0c;点击上传文件&#xff1a; 在私有云产…

Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2

Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88057717

【AT89C52单片机项目】数字密码锁设计

实验目的 使用单片机设计数字密码锁。 实验仪器 一套STC89C52RC开发板套件&#xff0c;包括STC89C52RC开发板&#xff0c;以及USB烧录线。 设计要求 1、有设置密码、开锁工作模式&#xff1b; 2、可以每次都设置密码&#xff0c;也可以设置一次密码多次使用。 实验原理 …

香港视频直播服务器需要多大的带宽(带宽计算方式)

​  香港视频直播服务器需要多大的带宽(怎么计算带宽大小)。目前短视频行业兴起&#xff0c;有许多人也想利用香港服务器搭建一个直播平台&#xff0c;但无奈不知道怎么选择资源大小&#xff0c;或者说什么样的配置能够满足直播的需求。关于直播的带宽大小和流量消耗的计算同…

django报错设置auth User

1.报错&#xff1a;auth.User.groups... auth.User.user_permissions... 我们的用户组、用户权限只能关联一个用户 &#xff0c;我们自己定义了一个用户表&#xff0c;系统还有一个用户表&#xff0c;这时候就会出问题。 解决办法&#xff1a; 让给我们自己定义的user替换系…

【C++修炼之路】类和对象(下)—— 完结篇

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、再谈构造函数1、初始化列表2、explicit 关键字 二、static 成员1、概念2、特性 三、友元1、友元函数2、友元类 四、内部类五…

【hadoop】部署hadoop的伪分布模式

hadoop的伪分布模式 伪分布模式的特点部署伪分布模式hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xml对NameNode进行格式化启动Hadoop 对部署是否完成进行测试免密码模式免密码模式的原理&#xff08;重要&#xff09;免密码模式的配置 伪分布模式的特点…

【基于 GitLab 的 CI/CD 实践】03、GitLab Pipeline 实践(上)

目录 一、GitLab Pipeline 流水线语法有哪些&#xff1f;流水线参数列表 如何检查语法错误&#xff1f;流水线语法检测 二、Pipeline 基础语法 job script before_script after_script stages 未定义 stages ​定义 stages 控制 stage 运行顺序 .pre & .post …

哇~真的是你呀!今天是LINUX中的RSYNC服务

目录 前言 一、概述 二、特性 三、rsync传输模式 四、rsync应用 五、格式 六、配置文件 七、守护进程传输 八、rsyncinotfy实时同步 一、概述 rsync是linux 下一个远程数据同步工具;他可通过LAN/WAN快速同步多台主机间的文件和目录&#xff0c;并适当利用rsync 算法减少数据的…

04.MySQL——用户管理

用户管理 用户管理的价值 用户 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 use mysql;select host,user,authentication_string from user;host&#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是localhost&#xff0c;表示只能从…