WEB开发网
开发学院软件开发C语言 C# 2010协变和逆变的新特性 阅读

C# 2010协变和逆变的新特性

 2009-05-29 08:31:30 来源:WEB开发网   
核心提示:1. 协变和逆变开发时经常与到以下的问题,首先看代码:定义一个水果类和继承了该类的苹果类:publicclassFruit{publicstringName{get;set;}}publicclassApple:Fruit{}有一个方法接收一个元素类型为Fruit的泛型集合,如下所示:staticvoidOutput(

1. 协变和逆变

开发时经常与到以下的问题,首先看代码:

定义一个水果类和继承了该类的苹果类:

public class Fruit
{
public string Name { get; set; }
}
 

public class Apple : Fruit
{

}

有一个方法接收一个元素类型为Fruit的泛型集合,如下所示:

static void Output(List fruits)
{
foreach (Fruit f in fruits)
Console.WriteLine(f.Name);
}

由于Apple类继承自Fruit,所以很自然的认为以下代码“应该”能够正常运行:

static void Main(string[] args)
{
List apples = new List();
 

Output(apples);

Console.ReadLine();
}

但实际上在.NET Framework 4.0以前的版本中这段代码不能通过编译。还有另外一种相似的情况,在Windows窗体应用程序中鼠标点击事件和键盘按键事件拥有不同类型的事件参数MouseEventArgs和KeyPressEventArgs,这两个类均继承自EventArgs,如果希望在这两件事件触发时执行相同的操作,期望编写以下“通用”的事件处理程序附加到两个事件上是行不通的:

private void Form1_UserAction(object sender, EventArgs e)
{
 

}

只能须创建两个单独的事件处理程序来执行操作。

Visual C# 2010 中引入的协变和逆变解决了类似于这样的问题。

在泛型接口和委托中协变(covariance)可以使用泛型参数所定义类型的继承类型,逆变(contravariance)用于使用更一般的类型。一个泛型接口或委托的泛型参数被声明为协变或逆变时该接口或委托称为变体。在.NET Framework 4和Visual Studio 2010中,C#和Visual Basic均支持变体泛型接口和委托,并且允许泛型参数的隐式转换,而且这两种语言都允许创建自定义变体接口和委托。变体只支持引用类型,值类型不支持变体。

1 2 3  下一页

Tags:逆变 特性

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