C#中泛型的用法2
【摘要】 前言上一篇博文简单介绍了泛型的约束,说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。这篇文章咱们一起看看。目前共5种类型的约束。类名:只有这个类型的类或从它继承的类才能用作类型实参class:任何引用类型,包含类,数组,委托,接口都可以用作类型实参struct:任何值类型都可以做类型实参接口名: 只有这个接口或实现接口的类型才能用作类型实参new(): 任何...
前言
上一篇博文简单介绍了泛型的约束,说是通过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));
泛型接口让我们编写参数和接口成员返回类型时泛型类型实参的接口。泛型接口的声明和非泛型接口的声明差不多,但是需要在接口名称之后的尖括号中放置类型参数。
需要注意两点:
- 实现不同类型参数的泛型接口时不同的接口
- 可在非泛型类型中实现泛型接口
其中实现泛型类型接口时,必须保证类型实参组合不会在类型中产生两个重复的接口。
明天咱们将一起学习在泛型类型创建过程中的一个主题,叫做可变性。分为协变、逆变、不变。
寄语
人生短暂,我不想去追求自己看不见的,我只想抓住我能看得见的。
原创不易,给个关注。
我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发 谢谢。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)