技术开发 频道

Visual C# 2010新特性之协变和逆变

  【IT168 技术文档】

  第一篇:Visual C# 2010新特性之命名和可选参数与类型等价支持 

  1.协变和逆变

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

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

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

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

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

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

static void Main(string[] args)
{
    IEnumerable
<Apple> apples = new List<Apple>();
    Output(apples);
    Console.ReadLine();
}

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

private void Form1_UserAction(object sender, EventArgs e)
{
}

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

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

0
相关文章