C#基础 操作符之where的用法 泛型约束

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

以上见解来自水木大哥

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

    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

约束为
约束类型为struct的泛型约束调用
具体可看的介绍

构造函数约束

    /// <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用法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章