1.
泛型類可以從具體的、封閉式構造或開放式構造基類繼承
class BaseNode { }
class BaseNodeGeneric<T> { }
// concrete type
class NodeConcrete<T> : BaseNode { }
//closed constructed type
class NodeClosed<T> : BaseNodeGeneric<int> { }
//open constructed type
class NodeOpen<T> : BaseNodeGeneric<T> { }
2.
非泛型類(換句話說,即具體類)可以從封閉式構造基類繼承
l 無法從開放式構造類型,運行時用戶端代碼無法提供基類所需的參數類型
//No error
class Node1 : BaseNodeGeneric<int> { }
//Generates an error
//class Node2 : BaseNodeGeneric<T> {}
//Generates an error
//class Node3 : T {}
3.
從開放式構造類型繼承的泛型類必須為任何未被繼承類共用的基類型別參數提供類型變數
class BaseNodeMultiple<T, U> { }
//No error
class Node4<T> : BaseNodeMultiple<T, int> { }
//No error
class Node5<T, U> : BaseNodeMultiple<T, U> { }
//Generates an error
//class Node6<T> : BaseNodeMultiple<T, U> {}
4.
從開放式構造類型繼承的泛型類必須指定約束,這些約束是基底類型約束的超集或暗示基底類型約束:
class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }
5.
泛型型別可以使用多個型別參數和約束
class SuperKeyType<K, V, U>
where U : System.IComparable<U>
where V : new()
{ }
6.
開放式構造類型和封閉式構造類型可以用作方法參數
class myGenericA<T>
{
void Swap<T>(List<T> list1, List<T> list2)
{
//code to swap items
}
void Swap(List<int> list1, List<int> list2)
{
//code to swap items
}
}
7.
如果某個泛型類實現了介面,則可以將該類的所有執行個體強制轉換為該介面
8.
泛型類是不變的
static void TestGenericBaseClass()
{
//Generate an error
List<object> myList = new List<string>();
//無法將類型“System.Collections.Generic.List<string>”隱式轉換為“System.Collections.Generic.List<object>”
}