.NET泛型術語有點含糊不清。更糟糕的是,它似乎在不同來源中使用含糊不清和不同。什麼基本上是不明確的是這4個方面的關係(相對於 「類型」):.NET泛型術語 - 打開/關閉,未綁定/構建
- 開放
- 關閉
- 綁定 構建
我明白List<T>
是打開並List<int>
已關閉。但是,與開放/封閉類型有關的「構造」和「未綁定」究竟是什麼?
.NET泛型術語有點含糊不清。更糟糕的是,它似乎在不同來源中使用含糊不清和不同。什麼基本上是不明確的是這4個方面的關係(相對於 「類型」):.NET泛型術語 - 打開/關閉,未綁定/構建
我明白List<T>
是打開並List<int>
已關閉。但是,與開放/封閉類型有關的「構造」和「未綁定」究竟是什麼?
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的嘗試,使用相關屬性:IsGenericType
,IsGenericTypeDefinition
和ContainsGenericParameters
(根據語言規範,這些測試不是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.
實施例將足以:) – Konstantin 2011-02-02 16:27:35