C# 4.0中泛型协变性和逆变性详解
2009-06-04 08:30:21 来源:WEB开发网 object value = SomeMethod();
如果在.NET推出后,你已经了解C#或VB.NET,那么你应该很熟悉以上的内容。但是规则发生了一些改变。在很多方法中,你直觉上认为有效的其实不然。随着你渐渐深入了解,会发现你曾经认为是漏洞的东西很可能是该语言的说明。现在是时候解释一下为什么集合以不同的方式工作,以及未来将发生些什么变化。
基于对象的集合
.NET 1.x集合(ArrayList,HashTable,Queue等)可以被视为具有协变性。遗憾的是,它们不具有安全的协变性。事实上,它们具有恒定性。不过由于它们向System.Object保存了参考,它们看上去像是具有了协变性和逆变性。举几个例子就可以说明这个问题。
你可以认为这些集合是协变的,因为你可以创建一个员工对象的数组列表,然后使用这个列表作为任意方法的参数,这些方法使用的是类型数组列表的对象。通常这种方法很有效。这个方法可能能够与数组列表连用:
private void SafeCovariance(ArrayList bunchOfItems)
{
foreach(object o in bunchOfItems)
Console.WriteLine(o);
// reverse the items:
int start = 0;
int end = bunchOfItems.Count - 1;
while (start < end)
{
object tmp = bunchOfItems[start];
bunchOfItems[start] = bunchOfItems[end];
bunchOfItems[end] = tmp;
start++;
end--;
}
foreach(object o in bunchOfItems)
Console.WriteLine(o);
}
这个方法是安全的因为它没有改变集合中任何对象的类型。它列举了集合并将集合中已有的项目移动到了不同索引。不过并未改变任何类型,因此这个方法适用于所有实例。但是数组列表和其他传统的.NET 1.x集合不会被视为安全的协变。看这一方法:
更多精彩
赞助商链接