C#中泛型约束的具体用法

239 阅读1分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

欢迎各位朋友微信搜索「Andy阿辉」关注一波!

写一些程序员的所思所想,希望对你有帮助。

前言

上一篇博文简单介绍了泛型的约束,说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。

这篇文章咱们一起看看。

目前共5种类型的约束。

  • 类名:只有这个类型的类或从它继承的类才能用作类型实参
  • class:任何引用类型,包含类,数组,委托,接口都可以用作类型实参
  • struct:任何值类型都可以做类型实参
  • 接口名: 只有这个接口或实现接口的类型才能用作类型实参
  • new(): 任何带有无参公共构造函数的类型都可以用作类型实参

在实现过程中,最多只能有一个主约束且必须放在第一位;可以有多个接口名约束;如果存在构造函数约束,则必须放在最后。

泛型约束的具体用法

泛型其实定义声明好后和类型一样。

有泛型方法、泛型委托和泛型接口。具体用法如下所示:

泛型方法

        class Ahui2 
        {
            public void GetReverseAndPrintByAge<T>(T[] age)  
            {
                Array.Reverse(age);
                foreach (var item in age)
                {
                    Console.WriteLine("{0}"+item.ToString());
                }
                Console.WriteLine("");
            }
        }

泛型委托

        delegate void MyNameDelegate<T>(T value);

        class Ahui3 
        {
            static public void PrintString(String tempName) 
            {
                Console.WriteLine(tempName);
            }

            static public void PrintUpperString(String tempName)
            {
                Console.WriteLine(tempName.ToUpper()); 
            }
        }               
        static void Main(string[] args)
        {
            var myDel = new MyNameDelegate<String>(Ahui3.PrintString);
            myDel += Ahui3.PrintUpperString;

            myDel("Andyahui");

            Console.ReadKey();
        }

泛型接口

        interface IBaseAction<T> 
        {
            T isLove(T name);
        }

        class Ahui<S> : IBaseAction<S> 
        {
            public S isLove(S name)
            {
                return name;
            }
        }
            var ahui=new Ahui<string>();
            var ahui2 = new Ahui<int>();
            Console.WriteLine(""+ahui.isLove("阿辉"));
            Console.WriteLine("" + ahui2.isLove(27));

泛型接口让我们编写参数和接口成员返回类型时泛型类型实参的接口。泛型接口的声明和非泛型接口的声明差不多,但是需要在接口名称之后的尖括号中放置类型参数。

需要注意两点:

  • 实现不同类型参数的泛型接口时不同的接口
  • 可在非泛型类型中实现泛型接口

其中实现泛型类型接口时,必须保证类型实参组合不会在类型中产生两个重复的接口。

明天咱们将一起学习在泛型类型创建过程中的一个主题,叫做可变性。分为协变、逆变、不变。

寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。