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