当前位置: 首页 > news >正文

C#—泛型约束

C#—泛型约束

概念:

泛型约束就是告知编译器类型参数必须具备的功能。 在没有任何约束的情况下,类型参数可以是任何类型。 编译器只能假定 System.Object 的成员,它是任何 .NET 类型的最终基类。当分配给泛型的类型参数不满足约束的类型时,编译器会报出 Compiler Error CS0452 的错误。在 C# 中允许使用 where 上下文关键字指定约束,让泛型的类有一定的限制。

示列

// 值类型约束
class Test1<T> where T:struct
{public T value;public void TestFun<K>(K v) where K:struct {  }
}// 实现
Test2<Random> t2=new Test2<Random>();
t2.value=new Random();
t2.TestFun<object>(new object());

约束类型:

一 值类型泛型约束:

只允许泛型为值类型  (T 只能是值类型)

public void F1<T>(T a) where T : struct { }

二 引用类型泛型约束:

只允许泛型为引用类型(T 只能是引用类型)

public void F2<T>(T a) where T : class { }

三 指定引用类型泛型约束:

只允许泛型为该类或子类(T 只能是A或者A的子类)

public void F3<T>(T a) where T : A { }

四 必须为无参构造

①必须是无参构造函数,如果结构体中编写有参函数,无参构造函数不会被顶替。
②必须是公共的
③必须是非抽象类型,因为抽象类型不能够去new它。

public void F4<T>(T a) where T : new() { }

五 多约束使用

多个泛型约束用where连接即可

class Test8<T,K> where T:class, new()  where K:struct  {   }

六 自定义约束:

T的只能是U提供的类型,或者U的子类,T要么是U类型,要么是U子类

public void F5<T, U>(T a, U b) where T : U  { }

在可为 null 的上下文中,如果 U 是不可为 null 的引用类型,T 必须是不可为 null 的引用类型。 如果 U 是可为 null 的引用类型,则 T 可以是可为 null 的引用类型,也可以是不可为 null 的引用类型。

七 接口的泛型约束:

只允许泛型为实现这个接口的类或者子类(T 只能是Boy类型 或者Boy的子类)

public void F4<T>(T a) where T : IMan { }

八 可为空接口类型约束(:<接口名称>?)

表示类型参数必须是指定的接口或实现指定的接口

public void F4<T>(T a) where T : IMan ? {  }

九 可为空引用类型约束(: class?)

 where T : class? 表示类型参数必须是可为 null 或不可为 null 的引用类型。

十 不可为空约束(: notnull)

where T : notnull 表示类型参数必须是不可为 null 的类型。

十一 基方法约束(: default)

where T : default 表示重写方法或提供显式接口实现时,如果需要指定不受约束的类型参数,此约束可解决歧义。

十二 非托管类型约束(: unmanaged)

where T : unmanaged 表示类型参数必须是不可为 null 的非托管类型。

十三 可为空基类名约束(: <基类名>?)

where T :<基类名>? 表示类型参数必须是指定的基类或派生自指定的基类。

此篇文章部分借鉴与网络,如有冒犯请联系删除!!!

http://www.lryc.cn/news/505090.html

相关文章:

  • MeiliSearch:一款轻量级开源搜索引擎
  • Ansible playbook 详解与实战操作
  • 青少年夏令营管理系统的设计与开发(社团管理)(springboot+vue)+文档
  • 加速合并,音频与字幕的探讨
  • Uniapp插件如何通过NFC读取多种证卡信息?
  • 米哈游C++开发精选60道面试题及参考答案
  • 深度与视差的关系及其转换
  • 安全见闻全解析
  • 搭建Tomcat(四)---Servlet容器
  • PT2044A 单触控单输出IC
  • docker安装mysql5.7
  • 安卓 文件管理相关功能记录
  • GB28181系列三:GB28181流媒体服务器ZLMediaKit
  • ScottPlot学习的常用笔记
  • 二、mapbox-gl实现白膜立体建筑
  • mybatisplus 分库查询
  • 计算属性 (vue3)
  • RabbitMQ 安装、配置和使用介绍 使用前端js直接调用方式
  • 电脑显示器选购指南2024
  • vue2中如何实现自定义指令
  • QT从入门到精通(一)——Qlabel介绍与使用
  • 【jpa】springboot使用jpa示例
  • Python Flask Web框架快速入门
  • ansible自动化运维(五)roles角色管理
  • 前端学习一
  • 【OSS】php使用oss存储
  • UE5 C+、C++、C# 构造方法区别示例
  • leetcode-146.LRU缓存(易理解)
  • JavaSe部分总结
  • iPhone批量删除照片的方法