CLR via C#学习笔记-第十二章-泛型接口、委托

12.3 泛型接口

泛型接口的意义

显然,泛型的主要作用就是定义泛型的引用类型和值类型。

然而对泛型接口的支持对CLR来说也很重要。
没有泛型接口,每次用非泛型接口如IComparable来操作值类型都会发生装箱,而且会失去编译时的类型安全性。

这将严重制约泛型类型的应用范围,因此CLR提供了对泛型接口的支持。

引用类型和值类型可以指定类型实参实现泛型接口,也可以保持类型实参的未指定状态来实现泛型接口。

 

泛型接口的实现

以下泛型接口定义是FCL的一部分:

public interface IEnumerator<T>:IDisposable,IEnumerator{
    T Current{get;}
}

指定类型实参的实现

下面的示例类型实现了上述泛型接口,而且指定了类型实参。

注意Triangle对象可枚举一组Point对象。还要注意,Current属性只有Point数据类型。

internal sealed class Triangle<T>:IEnumerator<Point>{
    private Point[] m_array;
    //IEnumerator<T>的Current属性是Point类型
    public Point Current{get{...}}
    ...
}

未指定类型实参的实现

下例实现了相同的泛型接口,但保持类型实参的未指定状态:

internal sealed class ArrayEnumerator<T>:IEnumerator<T>{
    private T[] m_array;
    //IEnumerator<T>的Current属性是T类型
    public T Current{get{...}}
    ...
}

12.4 泛型委托

12.5 委托和接口的逆变和斜变泛型类型实参

posted @ 2018-11-03 23:12  田错  阅读(159)  评论(0编辑  收藏  举报