1. 程式人生 > >CLR via C#學習筆記-第十二章-泛型接口、委托

CLR via C#學習筆記-第十二章-泛型接口、委托

pre 類型安全 sealed 2.4 span 接口 triangle 泛型類 保持

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 委托和接口的逆變和斜變泛型類型實參

CLR via C#學習筆記-第十二章-泛型接口、委托