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

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

 2009-06-04 08:30:21 来源:WEB开发网   
核心提示:VS2010的推出会为我们带来新版本的C#,了解C#4.0中的新功能有助于我们利用编码,C# 4.0中泛型协变性和逆变性详解,它还能够帮助我们了解程序中正在出现,而下一代的C#有可能会解决的错误,例如,你可能会需要对这段代码进行编译:publicstaticvoidPrintOutput(objectthing){if

VS2010的推出会为我们带来新版本的C#。了解C#4.0中的新功能有助于我们利用编码。它还能够帮助我们了解程序中正在出现,而下一代的C#有可能会解决的错误。最终,这样的实践可以帮助我们在现有的知识结构上创建适应C#4.0的业务。

在本文中我们关注的是C# 4.0中的协变性和逆变性。

恒定性,协变性和逆变性

在进一步研究问题之前,我们先解释一下恒定性,协变性,逆变性参数以及返回类型这些概念的意思。大家对这些概念应该是熟悉的,即便那你可能并不能把握这些概念的正式定义。

如果你必须使用完全匹配正式类型的名称,那么返回的值或参数是不变的。如果你能够使用更多的衍生类型作为正式参数类型的代替物,那么参数是可变的。如果你能够将返回的类型分配给拥有较少类型的变量,那么返回的值是逆变的。

在大多数情况下,C#支持协变参数和逆变的返回类型。这一特性也符合其他所有的对象指向型语言。事实上,多态性通常是建立在协变和逆变的概念之上的。直观上,我们发现是可以将衍生的类对象发送给任何期望基类对象的方法。比较,衍生的对象也是基类对象的实例。本能地我们也清楚,我们可以将方法的结果保存在拥有较少衍生对象类型的变量中。例如,你可能会需要对这段代码进行编译:

public static void PrintOutput(object thing) 
{

if (thing != null)

Console.WriteLine(thing);

}

// elsewhere:

PrintOutput(5);

PrintOutput("This is a string");

这段代码之所以有效是因为参数类型在C#中具有协变性,你可以将任意方法保存在类型对象的变量中,因为C#中返回类型是逆变的:

1 2 3 4 5  下一页

Tags:变性 逆变 详解

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