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

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

 2009-06-04 08:30:21 来源:WEB开发网   
核心提示: objectvalue=SomeMethod();如果在.NET推出后,你已经了解C#或VB.NET,C# 4.0中泛型协变性和逆变性详解(2),那么你应该很熟悉以上的内容,但是规则发生了一些改变,不过并未改变任何类型,因此这个方法适用于所有实例,在很多方法中,你直觉上认为有效的其实不然

 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集合不会被视为安全的协变。看这一方法:

上一页  1 2 3 4 5  下一页

Tags:变性 逆变 详解

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