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

【C#补全计划】泛型约束

一、泛型约束的概念

1. 作用:让泛型的类型有一定的限制

2. 关键字:where

3. 种类:6种

        (1)值类型: struct

        (2)引用类型:class

        (3)无参的公共构造函数:new()

        (4)某个类本身或其派生类:类名

        (5)某个接口的派生类:接口名

        (6)另一个泛型类本身或其派生类型:其他泛型

4. 语法:where 泛型 : 种类

二、泛型约束的使用

1. 值类型

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}
}

2. 引用类型

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}
}

3. 存在公共的无参构造函数

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());// Test3<A> t3 = new Test3<A>(); 编译报错:因为Test3是无参公共构造函数约束,而A没有公共无参构造函数Test3<B> t3 = new Test3<B>();t3.fun(new B());}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}// 存在公共无参构造函数class Test3<T> where T : new(){public T value;public void fun<K>(K k) where K : new(){Console.WriteLine(k + "有公共无参构造方法");}}class A{private int value;public A(int value){this.value = value;}}class B{public B() {}}
}

4. 是某个类本身或其派生类

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());// Test3<A> t3 = new Test3<A>(); 编译报错:因为Test3是无参公共构造函数约束,而A没有公共无参构造函数Test3<B> t3 = new Test3<B>();t3.fun(new B());// Test4<Test1<int>> t4 = new Test4<Test1<int>>(); 编译报错:因为Test4是Test2或其子类约束,而Test1不是Test2或其子类Test4<Test2<object>> t4 = new Test4<Test2<object>>();t4.fun(new Test2<object>());}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}// 存在公共无参构造函数class Test3<T> where T : new(){public T value;public void fun<K>(K k) where K : new(){Console.WriteLine(k + "有公共无参构造方法");}}class A{private int value;public A(int value){this.value = value;}}class B{public B() {}}class Test4<T> where T : Test2<object>{public T value;public void fun<K>(K k) where K : Test2<object>{Console.WriteLine(k + "是Test2类或其派生类");}}
}

5. 是某个接口的派生类型

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());// Test3<A> t3 = new Test3<A>(); 编译报错:因为Test3是无参公共构造函数约束,而A没有公共无参构造函数Test3<B> t3 = new Test3<B>();t3.fun(new B());// Test4<Test1<int>> t4 = new Test4<Test1<int>>(); 编译报错:因为Test4是Test2或其子类约束,而Test1不是Test2或其子类Test4<Test2<object>> t4 = new Test4<Test2<object>>();t4.fun(new Test2<object>());// Test5<A> t5 = new Test5<A>(); 编译报错:因为Test5是ITest接口实现类约束,而A没有实现ITest接口Test5<C> t5 = new Test5<C>();t5.fun(new C());}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}// 存在公共无参构造函数class Test3<T> where T : new(){public T value;public void fun<K>(K k) where K : new(){Console.WriteLine(k + "有公共无参构造方法");}}class A{private int value;public A(int value){this.value = value;}}class B{public B() {}}class Test4<T> where T : Test2<object>{public T value;public void fun<K>(K k) where K : Test2<object>{Console.WriteLine(k + "是Test2类或其派生类");}}// 接口约束class Test5<T> where T : ITest{public T value;public void fun<K>(K k) where K : ITest{Console.WriteLine(k + "是ITest接口的派生类");}}interface ITest { }class C : ITest { }
}

6. 是另一个泛型类本身或其派生类型

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());// Test3<A> t3 = new Test3<A>(); 编译报错:因为Test3是无参公共构造函数约束,而A没有公共无参构造函数Test3<B> t3 = new Test3<B>();t3.fun(new B());// Test4<Test1<int>> t4 = new Test4<Test1<int>>(); 编译报错:因为Test4是Test2或其子类约束,而Test1不是Test2或其子类Test4<Test2<object>> t4 = new Test4<Test2<object>>();t4.fun(new Test2<object>());// Test5<A> t5 = new Test5<A>(); 编译报错:因为Test5是ITest接口实现类约束,而A没有实现ITest接口Test5<C> t5 = new Test5<C>();t5.fun(new C());// Test6<C, E> t6 = new Test6<C, E>(); 编译报错:因为Test6是另一个泛型类或及其派生类约束,而C不是E或其派生类Test6<D, E> t6 = new Test6<D, E>();t6.fun<D, E>(new D());}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}// 存在公共无参构造函数class Test3<T> where T : new(){public T value;public void fun<K>(K k) where K : new(){Console.WriteLine(k + "有公共无参构造方法");}}class A{private int value;public A(int value){this.value = value;}}class B{public B() {}}class Test4<T> where T : Test2<object>{public T value;public void fun<K>(K k) where K : Test2<object>{Console.WriteLine(k + "是Test2类或其派生类");}}// 接口约束class Test5<T> where T : ITest{public T value;public void fun<K>(K k) where K : ITest{Console.WriteLine(k + "是ITest接口的派生类");}}interface ITest { }class C : ITest { }// 泛型类及其派生类约束class Test6<T, M> where T : M{public T value;public void fun<K, V>(K k) where K : V{Console.WriteLine(k + "是" + typeof(V) + "或其派生类");}}class E { }class D : E { }
}

运行结果如下:

三、泛型有多个约束

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());// Test3<A> t3 = new Test3<A>(); 编译报错:因为Test3是无参公共构造函数约束,而A没有公共无参构造函数Test3<B> t3 = new Test3<B>();t3.fun(new B());// Test4<Test1<int>> t4 = new Test4<Test1<int>>(); 编译报错:因为Test4是Test2或其子类约束,而Test1不是Test2或其子类Test4<Test2<object>> t4 = new Test4<Test2<object>>();t4.fun(new Test2<object>());// Test5<A> t5 = new Test5<A>(); 编译报错:因为Test5是ITest接口实现类约束,而A没有实现ITest接口Test5<C> t5 = new Test5<C>();t5.fun(new C());// Test6<C, E> t6 = new Test6<C, E>(); 编译报错:因为Test6是另一个泛型类或及其派生类约束,而C不是E或其派生类Test6<D, E> t6 = new Test6<D, E>();t6.fun<D, E>(new D());Test7<B> t7 = new Test7<B>();t7.fun(new B());}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}// 存在公共无参构造函数class Test3<T> where T : new(){public T value;public void fun<K>(K k) where K : new(){Console.WriteLine(k + "有公共无参构造方法");}}class A{private int value;public A(int value){this.value = value;}}class B{public B() {}}class Test4<T> where T : Test2<object>{public T value;public void fun<K>(K k) where K : Test2<object>{Console.WriteLine(k + "是Test2类或其派生类");}}// 接口约束class Test5<T> where T : ITest{public T value;public void fun<K>(K k) where K : ITest{Console.WriteLine(k + "是ITest接口的派生类");}}interface ITest { }class C : ITest { }// 泛型类及其派生类约束class Test6<T, M> where T : M{public T value;public void fun<K, V>(K k) where K : V{Console.WriteLine(k + "是" + typeof(V) + "或其派生类");}}class E { }class D : E { }// 泛型有多个约束:使用逗号分隔class Test7<T> where T : class, new(){public T value;public void fun<K>(K k) where K : class, new(){Console.WriteLine(k + "是引用类型且有公共无参构造方法");}}
}

运行结果如下:

四、多个泛型有约束

using System;namespace GenericConstraints
{class Program{static void Main(string[] args){// Test<object> t1 = new Test<object>(); 编译报错:因为Test1是值类型约束,而object是引用类型Test1<int> t1 = new Test1<int>();t1.fun(123);// Test2<int> t2 = new Test2<int>(); 编译报错:因为Test2是引用类型约束,而int是值类型Test2<object> t2 = new Test2<object>();t2.fun(new Random());// Test3<A> t3 = new Test3<A>(); 编译报错:因为Test3是无参公共构造函数约束,而A没有公共无参构造函数Test3<B> t3 = new Test3<B>();t3.fun(new B());// Test4<Test1<int>> t4 = new Test4<Test1<int>>(); 编译报错:因为Test4是Test2或其子类约束,而Test1不是Test2或其子类Test4<Test2<object>> t4 = new Test4<Test2<object>>();t4.fun(new Test2<object>());// Test5<A> t5 = new Test5<A>(); 编译报错:因为Test5是ITest接口实现类约束,而A没有实现ITest接口Test5<C> t5 = new Test5<C>();t5.fun(new C());// Test6<C, E> t6 = new Test6<C, E>(); 编译报错:因为Test6是另一个泛型类或及其派生类约束,而C不是E或其派生类Test6<D, E> t6 = new Test6<D, E>();t6.fun<D, E>(new D());Test7<B> t7 = new Test7<B>();t7.fun(new B());Test8<int, object> t8 = new Test8<int, object>();t8.fun(666, "Hello World!");}}// 值类型class Test1<T> where T : struct{public T value;public void fun<K>(K k) where K : struct{Console.WriteLine(k + "是值类型");}}// 引用类型class Test2<T> where T : class{public T value;public void fun<K>(K k) where K : class{Console.WriteLine(k + "是引用类型");}}// 存在公共无参构造函数class Test3<T> where T : new(){public T value;public void fun<K>(K k) where K : new(){Console.WriteLine(k + "有公共无参构造方法");}}class A{private int value;public A(int value){this.value = value;}}class B{public B() {}}class Test4<T> where T : Test2<object>{public T value;public void fun<K>(K k) where K : Test2<object>{Console.WriteLine(k + "是Test2类或其派生类");}}// 接口约束class Test5<T> where T : ITest{public T value;public void fun<K>(K k) where K : ITest{Console.WriteLine(k + "是ITest接口的派生类");}}interface ITest { }class C : ITest { }// 泛型类及其派生类约束class Test6<T, M> where T : M{public T value;public void fun<K, V>(K k) where K : V{Console.WriteLine(k + "是" + typeof(V) + "或其派生类");}}class E { }class D : E { }// 泛型有多个约束:使用逗号分隔class Test7<T> where T : class, new(){public T value;public void fun<K>(K k) where K : class, new(){Console.WriteLine(k + "是引用类型且有公共无参构造方法");}}// 多个泛型有约束:多条where语句class Test8<T, M> where T : struct where M : class{public T value;public void fun<K, V>(K k, V v) where K : struct where V : class{Console.WriteLine(k + "是值类型且" + v + "是引用类型");}}
}

运行结果如下:

        今天的学习就到这里了。感谢阅读。

        再见!

http://www.dtcms.com/a/330440.html

相关文章:

  • 从0开始的中后台管理系统-7(订单列表功能实现,调用百度地图打点以及轨迹图动态展示)
  • 数据结构--------堆
  • 18.14 全量微调实战手册:7大核心配置提升工业级模型训练效率
  • 阿里云RDS SQL Server实例之间数据库迁移方案
  • 通信算法之313:FPGA中实现滑动相关消耗DSP资源及7045/7035的乘法器资源
  • 工具栏扩展应用接入说明
  • React和Vue
  • Webpack Plugin 深度解析:从原理到实战开发指南
  • 使用AI编程自动实现自动化操作
  • Java 设计模式-组合模式
  • python的艺术品收藏管理系统
  • 数学建模层次分析法(AHP)笔记
  • C++入门自学Day11-- List类型的自实现
  • 2025天府杯数学建模B题分析
  • Vite 为什么比 Webpack 快?原理深度分析
  • Mac 新电脑安装cocoapods报错ruby版本过低
  • 一周学会Matplotlib3 Python 数据可视化-绘制面积图(Area)
  • 如何用aiohttp实现每秒千次的网页抓取
  • 机器视觉的磁芯定位贴合应用
  • PHP现代化全栈开发:实时应用与WebSockets实践
  • JVM字节码文件结构
  • PHP持久连接与普通连接的区别
  • 【大模型私有化部署】实战部分:Ollama 部署教程
  • 云蝠智能 VoiceAgent:重构物流售后场景的智能化引擎
  • Lua语言程序设计2:函数、输入输出、控制结构
  • 在CentOS系统中怎么查看Apache日志文件
  • Morph Studio-一站式AI视频创作平台
  • 亚马逊品牌权力重构:第三方卖家崛起下的竞争生态与系统性应对框架
  • AI引擎重构数据安全:下一代分类分级平台的三大技术跃迁
  • 从概率填充到置信度校准:GPT-5如何从底层重构AI的“诚实”机制