C# 泛型约束(where)的使用小结

 更新时间:2026年06月26日 10:27:30   作者:影寂ldy  
本文主要介绍了C# 泛型约束(where)的使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、泛型约束 核心概念

1. 为什么需要泛型约束

普通泛型<T>T 可以是任意类型,范围太大,无法使用指定类型的专属方法、属性。

泛型约束:通过 where T : 约束条件缩小泛型类型范围,限制 T 只能是指定类型。

2. 约束语法

static void 方法名<T>(T 参数) where T : 约束条件
{

}

二、六大泛型约束

1. 无约束(任意类型)

语法:无 where 条件

规则:T 可以是值类型、引用类型、自定义类、接口、数组任意类型

// 无任何限制的泛型方法
static void Test1<T>(T a)
{
    Console.WriteLine("Test1");
}

2. 值类型约束struct

语法where T : struct

规则:T 只能是值类型(int、double、bool、结构体)

禁止:所有引用类型(string、数组、自定义类)

static void Test2<T>(T a) where T : struct
{
    Console.WriteLine("Test1");
}

// 正确:int是值类型
Test2(10);
// 报错:数组是引用类型,违反struct约束
// Test2(new int[] {1}); 

3. 引用类型约束class

语法where T : class

规则:T 只能是引用类型(类、接口、数组、string)

禁止:所有值类型(int、double、bool)

static void Test3<T>(T a) where T : class
{
    Console.WriteLine("Test1");
}

// 报错:int是值类型
// Test3(10);
// 正确:string是引用类型
Test3("ss");

4. 无参构造函数约束new()

语法where T : new()

规则:T 类型 必须拥有无参构造函数

适用场景:泛型方法内部需要 new T() 实例化对象

static void Test4<T>(T a) where T : new()
{
    Console.WriteLine("Test1");
}

// People类有无参构造函数,合法
Test4(new People());

注意:如果类只写了有参构造、没有无参构造,会直接报错。

5. 基类约束(父类约束)

语法where T : 父类名

规则:T 只能是指定父类 或 父类的派生类

static void Test5<T>(T a) where T : People
{
    Console.WriteLine("Test1");
}

Test5(new People()); // 父类本身
Test5(new Stu());    // 子类派生类,合法

6. 接口约束

语法where T : 接口名

规则:T 必须是 实现了该接口的类 / 派生类

static void Test6<T>(T a) where T : IPeople
{
    Console.WriteLine("Test1");
}

// SS类实现了IPeople接口,合法
Test6(new SS());

三、约束优先级与组合规则

  • structclass不能同时使用(互斥)
  • new() 必须放在所有约束的最后面
  • 可以多约束叠加:例如where T : class, IPeople, new()

四、所有报错原因汇总

  • Test2(new int[]{1}) 报错:数组是引用类型,Test2 约束必须是值类型 struct
  • Test3(10) 报错:int 是值类型,Test3 约束必须是引用类型 class

五、六大约束 终极对照表(背诵神器)

约束写法

允许类型

禁止类型

无约束

全部类型

struct

所有值类型

引用类型(类、数组、string)

class

所有引用类型

值类型(int、bool、double)

new()

有无参构造的类

无无参构造的类

父类名

父类、子类

无关类、接口

接口名

实现该接口的类

未实现接口的类

六、满分背诵口诀

  • 无约束通吃所有,范围最大最自由
  • struct只吃值类型,数组类全报错
  • class只吃引用类,数值类型进不来
  • new()要求无参构,实例化不报错
  • 父类约束认子孙,接口约束认实现

到此这篇关于C# 泛型约束(where)的使用小结的文章就介绍到这了,更多相关C# 泛型约束内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# 为String类型增加方法详解

    C# 为String类型增加方法详解

    下面小编就为大家带来一篇C# 为String类型增加方法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • C#中的递归APS和CPS模式详解

    C#中的递归APS和CPS模式详解

    这篇文章主要介绍了C#中的递归APS和CPS模式详解,本文讲解了累加器传递模式、CPS函数、CPS变换、CPS尾递归、尾递归与Continuation等内容,需要的朋友可以参考下
    2015-04-04
  • C#借助Spire.Doc实现Word表格自动排版

    C#借助Spire.Doc实现Word表格自动排版

    在日常开发中,利用C#自动化生成Word报告是一项常见需求,本文将介绍使用 Spire.Doc for .NET 组件,通过C#代码精确设置 C# Word 表格列宽,希望对大家有所帮助
    2026-02-02
  • C#使用Socket进行简单的通讯的示例代码

    C#使用Socket进行简单的通讯的示例代码

    Socket 类是基于与 Linux、macOS 或 Windows 的本机互操作性提供的托管代码版本的套接字服务,提供了一系列的接口来支持应用层的调用,下面我们就来学习一下如何使用Socket进行简单的通讯,需要的可以参考下
    2023-12-12
  • 基于WPF手写一个简单的消息对话框

    基于WPF手写一个简单的消息对话框

    消息对话框是UI界面中不可或缺的组成部分,用于给用户一些提示,警告或者询问的窗口,本文将使用WPF手写一个简单的消息对话框,感兴趣的小伙伴可以了解下
    2023-12-12
  • 在C# 8中如何使用默认接口方法详解

    在C# 8中如何使用默认接口方法详解

    这篇文章主要给大家介绍了关于在C# 8中如何使用默认接口方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • WPF实现授权码显示密文并支持换行

    WPF实现授权码显示密文并支持换行

    这篇文章主要为大家详细介绍了如何使用WPF实现授权码显示密文并支持换行,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-10-10
  • C#中的Drawing 类案例详解

    C#中的Drawing 类案例详解

    文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特性与WinForms的即时绘制模式,对C# Drawing类相关知识感兴趣的朋友一起看看吧
    2025-08-08
  • C# GDI在控件上绘图的方法

    C# GDI在控件上绘图的方法

    这篇文章主要介绍了C# GDI在控件上绘图的方法,包括了常见的鼠标事件及绘图操作,需要的朋友可以参考下
    2014-09-09
  • C# WinForm窗口最小化到系统托盘

    C# WinForm窗口最小化到系统托盘

    C#编写最小化时隐藏为任务栏图标的 Window appllication.
    2008-11-11

最新评论