可变类型形參列表(variant-type-parameter-lists)

  可变类型形參列表(variant-type-parameter-lists )仅仅能在接口和托付类型上出现。它与普通的type-parameter-lists的差异在于,它的每一个类型形參前面能够加上变化性批注:in和out。

  假设前面的变化性批注为out,则该类型形參成为协变类型形參;假设变化批注为in。则该类型形參成为逆变类型形參;假设不存在变化批注,则称该类型形參为固定类型形參

  比如:

interface C<out x ,in y ,z>
{
x M(x,y);
z P{get;set;}
}

  在上面的代码中,x为协变类型形參,y为逆变类型形參,z为固定类型形參。

  

类型形參变化安全性

  类型的类型形參列表中出现变化批注会限制类型在类型声明中能够出现的位置。假设存在下面情况之中的一个。则类型 T 是输出不安全 (output-unsafe) 的:

  ● T 为逆变类型形參

  ● T 为具有输出不安全元素类型的数组类型

  ● T 为从泛型类型 S< A1,… AK > 构造的接口或托付类型 S< X1, .. XK >,当中,对于至少一个 Ai,存在下面情况之中的一个:

  ● Xi 是协变或固定的。而 Ai 是输出不安全的。

  ● Xi 是逆变或固定的。而 Ai 是输入安全的。

假设存在下面情况之中的一个。则类型 T 是输入不安全 (input-unsafe) 的 :

  ● T 是协变类型形參

  ● T 是具有输入不安全元素类型的数组类型

  ● T 为从泛型类型 S< A1,… AK > 构造的接口或托付类型 S< X1, .. XK >,当中,对于至少一个 Ai,存在下面情况之中的一个:

  ● Xi 是协变或固定的,而 Ai 是输入不安全的。

  ● Xi 是逆变或固定的。而 Ai 是输出不安全的。

  从直观上看,应在输出位置上禁止使用输出不安全类型,在输入位置上禁止使用输入不安全类型。

  类型假设不是输出不安全的。则是输出安全 (output-safe) 的,假设不是输入不安全的。则是输入安全(input-safe) 的。即输入输出的安全性不存在出于安全和不安全之外的状态。

什么是类型參数

  类定义能够通过在类名后加入用尖括号括起来的类型參数名称列表来指定一组类型參数。类型參数可用于在类声明体中定义类的成员。在下面的演示样例中, Pair 的类型參数为 TFirst 和 TSecond:

public class Pair<TFirst,TSecond>
{
public TFirst First;
public TSecond Second;
}

  要声明为採用类型參数的类类型称为泛型类类型。结构类型、接口类型和托付类型也能够是泛型。当使用泛型类时。必须为每一个类型參数提供类型实參:

Pair<int,string> pair = new Pair<int,string> { First = 1, Second = “two” };
int i = pair.First; // TFirst is int
string s = pair.Second; // TSecond is string

  提供了类型实參的泛型类型(比如上面的 Pair< int,string >)称为构造的类型。

最新文章

  1. 从Facebook跑来阿里的赵海平大叔,你要干啥?
  2. javascript学习之运动框架
  3. 找出一个二维数组中的&quot;鞍点&quot;,即该位置上的元素在该行中最大,在该列中最小(也可能没有&quot;鞍点&quot;),打印有关信息.(提示:注意特殊情况:没鞍点或多个鞍点)
  4. centos 6.5 X64 安装 mongodb 2.6.1 (笔记 实测)
  5. PopupWindow+ListView+OnItemClick点击无效
  6. [Java 基础]运算符和表达式
  7. user profile services提示&ldquo;BAIL: MMS(7116): sql.cpp(8490): 0x80231334 (The sql connection string has unsupported values.)&rdquo;解决办法
  8. word20161130
  9. SQL Server 索引和表体系结构(二)
  10. linux知识积累
  11. android中利用实现二级联动的效果
  12. 【Android 多媒体开发】 MediaPlayer 状态机 接口 方法 解析
  13. HDU 2585 [Hotel]字符串递归处理
  14. ltp-ddt nor qspi spi调试中需要修改的地方
  15. laravel5.6中Session store not set on request问题如何解决
  16. java 面向对象抽象类和接口
  17. 15. 3Sum(字典)
  18. linux/Centos下查看和修改网卡Mac地址(ifconfig命令)
  19. SQL SERVER - 谁更改了SQL登录密码?
  20. python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码

热门文章

  1. NOIP真题汇总
  2. css为什么叫层叠样式表
  3. 【反射】Java反射机制
  4. C#语言最基础的认识变量
  5. 去除IOS苹果手机自带按钮样式的问题~
  6. linux,apache,mysql,php常用查看版本信息的方法
  7. TCP的send与recv函数小结
  8. tac
  9. 用svg做流程管理
  10. 如何给PDF文件添加水印?