可变类型形參列表(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 >)称为构造的类型。

[深入学习C#]输入输出安全性——可变类型形參列表的变化安全性的更多相关文章

  1. 可变与不可变类型数据,列表的copy方法

    我们先来了解一下可变与不可变类型的数据 (1)可变类型:列表,字典(内存中的数据允许被修改) 不可变类型:数字,字符串,元组(内存中的数据不允许被修改) 接着我们通过一个实例来看一看可变与不可变类型数 ...

  2. python学习(28) 浅谈可变对象的单例模式设计

    python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...

  3. Python探索记(16)——Python的可变类型与不可变类型

    # @Time : 2017/7/8 17:49 # @Author : 原创作者:谷哥的小弟 # @Site : 博客地址:http://blog.csdn.net/lfdfhl # @DESC : ...

  4. python中的不可变类型和可变类型

    在python中整形,字符串,元组是不可变类型,而列表和字典都是可变类型. 对于不可变类型进行重新赋值,相当于是用以前的变量名重新指向了新的地址,这个地址中存的变量值就是重新的赋值 通过python中 ...

  5. len、is、==、可变于不可变类型

    a="asdfghjkl;'iuygb" b="小米" c=['a','b','c'] d= {'name':1,'age':24} # len统计字符或元素的 ...

  6. python的可变类型和不可变类型

    Python有六种数据类型:数字类型.字符串类型.列表类型.元组类型.字典类型和集合类型 其中不可变类型包括三种:数字类型.字符串类型和元组类型 剩余三种为可变类型:列表类型.字典类型和集合类型 可变 ...

  7. Python-可变类型与不可变类型

    可变类型 可以变化的,列表和字典 利用id()函数 查看内存地址 内存地址变化即不可变类型. 内存地址不变化即可变类型 不可变类型 不可以变化的,字符串和数字 字符串内置方法 索引取值 索引切片 成员 ...

  8. java 不可变类型

    1. java不可变性初探 我们先看下面一个例子:代码如下: import java.math.BigInteger; public class BigProblem { public static ...

  9. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

随机推荐

  1. 【洛谷2926/BZOJ1607】[USACO08DEC]Patting Heads拍头(筛法)

    题目: 洛谷2926 (截止至本博客发表时,BZOJ1607题面有误,正确题面请到洛谷2926查看) 分析: = 一句话题意:给定\(n\)个数\(\{a_i\}\),求对于每个\(a_i\)有多少个 ...

  2. mysql使用出现错误:mysqld dead but subsys locked

    现象: 登陆时候出现如下信息 [root@localhost home]# mysql -uroot -p123456mysql: [Warning] Using a password on the ...

  3. Scala-基础-变量与常量

    import junit.framework.TestCase import org.junit.Test //变量 //var 代表变量 //val 代表常量 //关键字 class,extends ...

  4. python--11、协程

    协程,又称微线程,纤程.英文名Coroutine. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕. 所以子程 ...

  5. ZUK Z2 Pro(Z2121) 免解锁BL 免rec Magisk Xposed ROOT 救砖 ZUI 4.0.247

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  6. 服务器端 CentOS 下配置 JDK 和 Tonmcat 踩坑合集

    一.配置 JDK 时,在 /etc/profile 文件下配置环境变量,添加   #java environment export JAVA_HOME=/usr/java/jdk- export CL ...

  7. Java 6中类路径ClassPath对通配符的支持

    在java 6之前,如果我们的应用依赖多个jar包,通常是将所有jar包文件枚举设置到环境变量CLASSPATH或者命令行参数-classpath(-cp)中.通常我们需要写一段shell脚本实现该功 ...

  8. Kafka 入门和 Spring Boot 集成

    目录 Kafka 入门和 Spring Boot 集成 标签:博客 概述 应用场景 基本概念 基本结构 和Spring Boot 集成 集成概述 集成环境 kafka 环境搭建 Spring Boot ...

  9. k[原创]Faster R-CNN论文翻译

    物体检测论文翻译系列: 建议从前往后看,这些论文之间具有明显的延续性和递进性. R-CNN SPP-net Fast R-CNN Faster R-CNN Faster R-CNN论文翻译   原文地 ...

  10. 写一个 sum方法,在使用下面任一语法调用时,都可以正常工作

    console.log(sum(2,3)); // Outputs 5 console.log(sum(2)(3)); // Outputs 5 (至少)有两种方法可以做到: 方法1: functio ...