WEB开发网
开发学院软件开发C语言 C# 4.0中泛型协变性和逆变性详解 阅读

C# 4.0中泛型协变性和逆变性详解

 2009-06-04 08:30:21 来源:WEB开发网   
核心提示: 这个例子表明虽然典型的集合是不变的,但是你可以视它们为可变或可逆变,C# 4.0中泛型协变性和逆变性详解(4),不过这些集合并非安全可变,编译器难保不会出现失误,让我们检查其中的一些方法,数组参数是可变的,数组作为参数使用的时候,数组时而可变时而不可变

这个例子表明虽然典型的集合是不变的,但是你可以视它们为可变或可逆变。不过这些集合并非安全可变。编译器难保不会出现失误。

数组

作为参数使用的时候,数组时而可变时而不可变。和典型集合一样,数组具有非安全的协变性。首先,只有包含了参考类型的数组可以被视为具有协变性或逆变性。值类型的数组通常不可变,即便是调用一个期望对象数组的方法时也是如此。这一方法可以与其他任何参考类型的数组一起调用,但是你不能向其发送整数数组或其他数值类型:

 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");

}

}

上一页  1 2 3 4 5  下一页

Tags:变性 逆变 详解

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接