定義泛型
class MyClass<T1,T2,T3>
{
}
可以把它們用作字段的類型,屬性的類型,方法的傳回值以及參數類型。
不能假定他是什麼類型而使用他,通常隻能把他看作System.Object的類型。
可以進行null比較
(T1 op1,T2 op2)
if(op1 != null && op2 == null)
不能進行 op1 == op2
不能進行
T1 op1 = null
可以進行
T1 op1 = default(T1)
限制類型
多個限制用逗号隔開
可以有個where對任意或全部類型進行限制
限制必須出現在繼承的後面
class MyClass<T1,T2,T3> :MyBaseClass,IMyInterface
where T1 : constraint1,constraint2 where T2 : constraint3
{
}
可用的限制
struct 值類型
class 引用類型
base-class 基類或繼承自基類
interface 接口或實作了接口
new() 有一個公共的無參構造函數,必須是為類型指定的最後一個限制
泛型繼承
類型限制至少與基類相同
泛型類可以從具體的、封閉式構造或開放式構造基類繼承
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> { }
非泛型類可以從封閉式構造基類繼承,但無法從開放式構造類或類型參數繼承,因為在運作時用戶端代碼無法提供執行個體化基類所需的類型參數。
//No error
class Node1 : BaseNodeGeneric<int> { }
//Generates an error
//class Node2 : BaseNodeGeneric<T> {}
//Generates an error
//class Node3 : T {}
從開放式構造類型繼承的泛型類必須為任何未被繼承類共享的基類類型參數提供類型變量,如以下代碼所示:
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> {}
從開放式構造類型繼承的泛型類必須指定限制,這些限制是基類型限制的超集或暗示基類型限制:
class NodeItem<T> where T : System.IComparable<T>, new() { }
class SpecialNodeItem<T> : NodeItem<T> where T : System.IComparable<T>, new() { }
開放式構造類型和封閉式構造類型可以用作方法參數:
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
}
泛型運算符
泛型結構
泛型接口
泛型方法
泛型類型參數會改變方法的簽名
定義泛型委托 也可以使用限制
public delegate int MyDelegate<T1,T2>(T1 op1, T2 op2) where T1 :T2 ;
變體(variance)
協變(covariance)隻能用作傳回值
抗變(contravariance)
http://www.cnblogs.com/artech/archive/2011/01/13/1934914.html