欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# where的用法 泛型约束

程序员文章站 2022-06-16 08:18:56
...

啥叫泛型约束:就是你必须要符合这个规则来,不然就不让你编译通过 。

以上见解来自水木大哥

我们经常可以看到这样的代码

    public class InterfaceRestrict<T> where T : IComparable
    {

    }

而T后面跟的是泛型约束,这个案例的意思是,代入的类T必须是实现了IComparable接口的类
以下来介绍泛型约束中where 的用法

接口约束

    /// <summary>
    /// 接口约束
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class InterfaceRestrict<T> where T : IComparable
    {

    }

接口约束:限定代入的参数,必须是实现了某个接口(本代码是指IComparable)的类,否则报错
实现IComparable接口的类

    /// <summary>
    /// 实现IComparable接口的类
    /// </summary>
    public class ComparableClass : IComparable
    {
        public int CompareTo(object obj)
        {
            throw new NotImplementedException();
        }
    }

调用代码如下

            //接口约束
            var interfaceRestric = new InterfaceRestrict<ComparableClass>();

基类约束

    class BaseClassRestric<T> where T : struct
    {

    }

基类约束:限定代入的参数T,必须是某种基类型的数据,否则报错.
上述代码是限制了带入的参数必须要struct类型的数据(此处到现在可以这么理解)
结构体

    /// <summary>
    /// 测试结构体
    /// </summary>
    struct TestStruct
    {

    }

调用代码如下

//基类约束
var baseClassRestrict = new BaseClassRestric<TestStruct>();

值得一提的是,基类约束中:
如果约束类别为class,则可以看作是约束引用类型,所以带入的参数可以是任何类、接口、委托或数组类型.(因为这些参数,都是类)
如果约束类别为struct,则可以看作是约束值类型,所以带入的参数可以是任何简单值类型(int,byte),DateTime,Enum

C# where的用法 泛型约束
C# where的用法 泛型约束
具体可看的介绍

构造函数约束

    /// <summary>
    /// 函数约束,说明T函数必须要有一个无参的构造函数
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class FunctionRestrict<T> where T : new()
    {
    }

基类约束:限定代入的参数T,必须是有一个无参的构造函数,否则报错

    /// <summary>
    /// 有参构造类
    /// </summary>
    class HaveParaConstruClass
    {
        public HaveParaConstruClass(string str)
        {
        }
    }
    /// <summary>
    /// 无参构造类
    /// </summary>
    class NonParaConstruClass
    {
        public NonParaConstruClass()
        {
        }
    }

调用

            //构造函数约束
            //带入有参构造类,会报错
            // var functionRestrict = new FunctionRestrict<HaveParaConstruClass>();
            var functionRestrict = new FunctionRestrict<NonParaConstruClass>();

多类型约束

    class MultiTypeRestrict<T, U> where T : class
        where U : struct
    {
    }

多类型约束:所谓多类型约束,其实就是泛型约束中,有多个约束参数,在使用中,只要用where连接即可

PS:泛型约束在C#源码中非常常见,还是有必要去学会基本使用的.

本文章借鉴
C# where用法

相关标签: C#基础 c#