2011-02-02 104 views
15

.NET泛型術語有點含糊不清。更糟糕的是,它似乎在不同來源中使用含糊不清和不同。什麼基本上是不明確的是這4個方面的關係(相對於 「類型」):.NET泛型術語 - 打開/關閉,未綁定/構建

  1. 開放
  2. 關閉
  3. 綁定
  4. 構建

我明白List<T>是打開並List<int>已關閉。但是,與開放/封閉類型有關的「構造」和「未綁定」究竟是什麼?

回答

21

language specification

4.4構造類型

一個通用類型聲明,其本身 表示該 用作「藍圖」來形成未結合的通用型很多 不同類型,通過應用 類型參數。緊跟在通用類型名稱後面的尖括號(<和>) 中寫入的類型參數爲 。包含 的類型至少有一個類型參數稱爲 構造類型。構造類型 可用於 語言中的大多數地方,其中類型名稱可以顯示爲 。未綁定的泛型類型 只能在 typeof表達式(第7.6.11節)中使用。 [...]

4.4.2打開和關閉的類型

所有類型可以被分類爲 開放類型封閉類型。開放的 類型是涉及 參數的類型。更具體地說:

•A 類型參數定義了一個開放類型。

•陣列類型是開放類型if和 僅當其元素類型是開放的 類型時。

•構造類型是開放的 類型當且僅當其中一個或多個 類型參數是開放類型。 A 構造的嵌套類型是當且僅當其包含類型的一個或多個 類型自變量或類型參數 是開放的 類型時,構造的嵌套類型是開放的 類型。

封閉類型是一種類型,它不是一個開放類型,即 。 [...]

4.4.3結合和未結合類型

術語未綁定類型指非通用 型或未結合的通用類型。 術語綁定類型指的是非通用類型的 類型或構造的 類型。非綁定類型指的是由類型聲明聲明的實體 。 未綁定泛型類型本身不是 一個類型,並且不能被用作變量,參數的 類型或返回 值,或作爲基本類型。唯一 構建體,其中綁定的泛型 類型可以被引用是將typeof 表達式(§7.6.11)。


這是我想到的例子:

// Foo<T> is an unbound generic type. 
class Foo<T> { .. } 

// Bar<K> is an unbound generic type. 
// Its base-class Foo<K> is a constructed, open generic type. 
class Bar<K> : Foo<K> { .. } 

// IntFoo is not a generic type. 
// Its base-class Foo<int> is a constructed, closed generic type. 
class IntFoo : Foo<int> { .. } 

而這裏的領帶,在與反射API的嘗試,使用相關屬性:IsGenericTypeIsGenericTypeDefinitionContainsGenericParameters

(根據語言規範,這些測試不是100%預測每種「種類」 )。

+----------+---------------------+-----------+--------------+-------------------+ 
| Name |  Kind   | IsGenType | IsGenTypeDef | ContainsGenParams | 
+----------+---------------------+-----------+--------------+-------------------+ 
| Foo<> | Unbound    | TRUE  | TRUE   | TRUE    | 
| Foo<>* | Constructed, open | TRUE  | FALSE  | TRUE    | 
| Foo<int> | Constructed, closed | TRUE  | FALSE  | FALSE    | 
| IntFoo | Not generic   | FALSE  | FALSE  | FALSE    | 
+----------+---------------------+-----------+--------------+-------------------+ 
* = Bar<>'s base type. 
+0

實施例將足以:) – Konstantin 2011-02-02 16:27:35