C# 4.0中泛型协变性和逆变性详解
2009-06-04 08:30:21 来源:WEB开发网这个例子表明虽然典型的集合是不变的,但是你可以视它们为可变或可逆变。不过这些集合并非安全可变。编译器难保不会出现失误。
数组
作为参数使用的时候,数组时而可变时而不可变。和典型集合一样,数组具有非安全的协变性。首先,只有包含了参考类型的数组可以被视为具有协变性或逆变性。值类型的数组通常不可变,即便是调用一个期望对象数组的方法时也是如此。这一方法可以与其他任何参考类型的数组一起调用,但是你不能向其发送整数数组或其他数值类型:
private void PrintCollection(object[] collection)
{
foreach (object o in collection)
Console.WriteLine(o);
}
只要你限制引用类型,数组就会具有协变性和逆变性。但是仍然是不安全的。你将数组视为可变或逆变的次数越多,越会发现你需要处理ArrayTypeMismatchException。让我们检查其中的一些方法。数组参数是可变的,但却是非安全协变。检查下列不安全的方法:
private class B
{
public override string ToString()
{
return "This is a B";
}
}
private class D : B
{
public override string ToString()
{
return "This is a D";
}
}
private class D2 : B
{
public override string ToString()
{
return "This is a D2";
}
}
private void DestroyCollection(B[] storage)
{
try
{
for (int index = 0; index < storage.Length; index++)
storage[index] = new D2();
}
catch (ArrayTypeMismatchException)
{
Console.WriteLine("ArrayTypeMismatch");
}
}
更多精彩
赞助商链接