博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泛型及约束
阅读量:7001 次
发布时间:2019-06-27

本文共 1099 字,大约阅读时间需要 3 分钟。

程序中经常会用到泛型,如:

class Program
{
static void Main(string[] args)
{
string a = "a";
string b = "b";
Console.WriteLine("before change, a={0},b={1}.", a, b);
Change
(ref a, ref b);
Console.WriteLine("after change, a={0},b={1}.", a, b);
 
Console.ReadKey();
}
static void Change
(ref T a, ref T b)
{
var c = a;
a = b;
b = c;
}
}

但有时候会碰到类似下面的写法,带where的:

static void Change2
(ref T a, ref T b) where T:struct
{
var c = a;
a = b;
b = c;
}

刚开始看到未免会比较晕,在msdn上搜索下,原来是泛型约束,详细的泛型约束如下:

 

约束 说明
T:Struct 类型参数必须是值类型。 可以指定除 以外的任何值类型。
T:Class 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:New() 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。
T:<BaseClass> 类型参数必须是指定的基类或派生自指定的基类。
T:<Interface> 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。
T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。

所以,在如果要调用前面加了约束的函数Change2,则必须使用非Nullable类型,如int,不能使用string了。

int a = 1;
int b = 2;
Console.WriteLine("before change, a={0},b={1}.", a, b);
Change2
(ref a, ref b);
Console.WriteLine("after change, a={0},b={1}.", a, b);

转载于:https://www.cnblogs.com/4kapple/archive/2011/09/20/2182437.html

你可能感兴趣的文章
微信企业号验证
查看>>
请问set JAVA_OPTS的各项參数是什么意思?
查看>>
Linux安装JDK
查看>>
C#常用控件缩写
查看>>
.NET足球赛事资料数据库平台SmartLottery开源发布——全球足球联赛应有尽有
查看>>
关于Eclipse生成和导入Patch文件.
查看>>
如何使用Photoshop(PS)将图片的底色变为透明
查看>>
IDEA实现序列号接口
查看>>
人件札记:保持高效的办公室环境
查看>>
Mysql中使用流式查询避免数据量过大导致OOM
查看>>
为什么中台是传统企业数字化转型的关键?
查看>>
中国技术开放日专场在美国旧金山隆重开幕
查看>>
从责任界定和问题预警角度 解读全栈溯源对DevOps的价值
查看>>
百度发布开源智能边缘计算平台OpenEdge
查看>>
JavaScript引擎V8 5.1遵循了更多的ECMAScript规范并支持WASM
查看>>
广度、深度、易用性,详解6大机器学习云
查看>>
雇佣和留住开发人员,打造优秀的团队
查看>>
关于5G被激烈讨论的那些争端和冲突
查看>>
Jenkins部署码云SpringBoot项目
查看>>
抛弃NVelocity,来玩玩Razor
查看>>