數組
作為參數使用的時候,數組時而可變時而不可變。和典型集合一樣,數組具有非安全的協變性。首先,只有包含了參考類型的數組可以被視為具有協變性或逆變性。值類型的數組通常不可變,即便是調用一個期望對象數組的方法時也是如此。這一方法可以與其他任何參考類型的數組一起調用,但是你不能向其發送整數數組或其他數值類型:
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");
}
}