C#中常见的五大泛型约束举例详解

 更新时间:2025年08月27日 09:49:23   作者:CSharp笔记记录  
泛型是C# 2.0引入的核心特性,它允许在定义类、接口、方法、委托等时使用未指定的类型参数,在使用时再指定具体类型,这篇文章主要介绍了C#中常见的五大泛型约束的相关资料,需要的朋友可以参考下

前言

在 C# 中,泛型(Generics)允许你定义类型安全且可重用的代码,而不必指定具体的类型。为了更精确地控制泛型类型的行为,可以使用泛型约束(Generic Constraints)来限制泛型类型参数的类型。泛型约束通过 where 关键字来实现。

以下是 C# 中常见的 五大泛型约束,它们有助于限定泛型参数的类型特性:

1.where T : struct

值类型约束

这个约束指定 T 必须是值类型。值类型包括结构体(struct)、枚举(enum)以及基本数据类型(如 int, float, bool 等)。

应用场景

  • 当你只需要值类型时,使用此约束可以确保类型安全。
  • 不能将引用类型(如类或接口)传递给此约束。

示例

public void PrintValueType<T>(T value) where T : struct
{
    Console.WriteLine(value);
}

限制

  • 不允许使用 null 值,因为 null 是引用类型的标志。所有的值类型默认是不可空的(除非使用 Nullable<T>)。

2.where T : class

引用类型约束

这个约束指定 T 必须是引用类型。引用类型包括所有类、接口、委托等。

应用场景

  • 当你需要保证传递的类型是引用类型时使用该约束。
  • class 限制也排除了值类型和指针类型。

示例

public void PrintReferenceType<T>(T value) where T : class
{
    Console.WriteLine(value.ToString());
}

限制

  • 可以传递 null 值,因为引用类型默认可以为 null

3.where T : new()

无参数构造函数约束

这个约束要求 T 必须有一个无参构造函数。通过这个约束,确保你能够在泛型方法或类中使用 new 运算符来创建 T 类型的实例。

应用场景

  • 当你希望在泛型类型中实例化对象时,这个约束非常有用。
  • 常常和其他约束一起使用,确保泛型类型能够被实例化。

示例

public T CreateInstance<T>() where T : new()
{
    return new T();
}

限制

  • 类型 T 必须有一个无参数的构造函数。如果 T 没有无参构造函数,编译时会报错。

4.where T : BaseClass

基类约束

这个约束指定 T 必须是 BaseClass 类型或其派生类型。也就是说,T 必须继承自某个指定的类。

应用场景

  • 当你只想使用某个基类及其子类时,使用这个约束。
  • 这允许你访问基类和派生类的成员,而不需要在泛型类型中使用具体的类型。

示例

public void PrintBaseClass<T>(T obj) where T : BaseClass
{
    obj.PrintInfo();
}

限制

  • T 必须是 BaseClass 或其子类,不能是其他类。

5.where T : IInterface

接口约束

这个约束指定 T 必须实现某个接口。通过这种方式,可以确保泛型类型实现了接口中的方法和属性。

应用场景

  • 当你想保证泛型类型实现了特定接口时使用此约束。
  • 可以用于保证类型具备接口定义的行为,比如 IComparableIDisposable 等常用接口。

示例

public void PrintComparable<T>(T obj) where T : IComparable
{
    int result = obj.CompareTo(default(T));
    Console.WriteLine($"Comparison result: {result}");
}

限制

  • 类型 T 必须实现 IInterface 接口。如果类型没有实现接口,会导致编译错误。

组合多个约束

你还可以将多个约束组合起来使用。例如,你可以要求 T 同时满足多个条件:

public void ProcessData<T>(T obj) where T : class, IComparable, new()
{
    // 类型 T 必须是引用类型、实现了 IComparable 接口,并且有一个无参构造函数
}

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

相关文章

  • C# LINQ常用语法及实际应用示例

    C# LINQ常用语法及实际应用示例

    LINQ (Language Integrated Query) 是C#中用于数据查询的语法,可以查询各种数据源(数组、集合、数据库等),本文给大家介绍C# LINQ常用语法,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • c#冒泡排序算法示例

    c#冒泡排序算法示例

    这篇文章主要介绍了c#冒泡排序算法示例,需要的朋友可以参考下
    2014-04-04
  • 利用C#编写扫雷游戏(附源码)

    利用C#编写扫雷游戏(附源码)

    扫雷游戏相信不用给大家过多介绍,大家基本都玩过,下面这篇文章主要给大家介绍了关于如何利用C#编写扫雷游戏的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2019-01-01
  • C#中获取程序路径的几种方法及其区别说明

    C#中获取程序路径的几种方法及其区别说明

    这篇文章主要介绍了C#中获取程序路径的几种方法及其区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • unity使用射线实现贴花系统

    unity使用射线实现贴花系统

    这篇文章主要为大家详细介绍了unity使用射线实现贴花系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Unity3D实现控制摄像机移动

    Unity3D实现控制摄像机移动

    这篇文章主要为大家详细介绍了Unity3D实现控制摄像机移动 ,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • C#获取屏幕分辨率缩放比例的方法与示例

    C#获取屏幕分辨率缩放比例的方法与示例

    在C#中,获取屏幕分辨率缩放比例通常指的是Dpi缩放比例,它表示显示设备的独立像素与设备无关像素(96 DPI)的比例,这通常用于确保应用程序在不同分辨率和缩放设置的显示设备上都能正确显示,本文给大家介绍了C#获取屏幕分辨率缩放比例的方法与示例,需要的朋友可以参考下
    2024-07-07
  • 100行C#代码实现经典扫雷游戏

    100行C#代码实现经典扫雷游戏

    这篇文章主要为大家详细介绍了如何用100行C#代码实现经典的扫雷游戏,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • C#异步编程库AsyncEx的实现

    C#异步编程库AsyncEx的实现

    本文主要介绍了C#异步编程库AsyncEx的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • C#高保真实现Word转HTML实战指南

    C#高保真实现Word转HTML实战指南

    在数字化办公中,文档内容的高效流转与展示是企业应用和Web服务不可或缺的一环,本文将探讨如何利用 C# 语言,并借助专业的文档处理库,实现高保真的 Word转HTML 转换,需要的可以了解下
    2025-08-08

最新评论