前言
上一篇博文简单介绍了泛型的约束,说是通过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));
泛型接口让我们编写参数和接口成员返回类型是泛型类型实参的接口。泛型接口的声明和非泛型接口的声明差不多,但是需要在接口名称之后的尖括号中放置类型参数。
需要注意两点:
实现不同类型参数的泛型接口是不同的接口
可在非泛型类型中实现泛型接口
其中实现泛型类型接口时,必须保证类型实参组合不会在类型中产生两个重复的接口。
明天咱们将一起学习在泛型类型创建过程中的一个主题,叫做可变性。分为协变、逆变、不变。
寄语
人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。
原创不易,给个关注。
我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、再看、分享 谢谢。
往期推荐
C#中泛型的用法
C#中的泛型
C#中接口的用法
C#中的接口