C#中的泛型約束只支援顯示的約束,因為這樣才能保證C#中的型別安全,但顯示的約束並非是必須的,如果不加約束,泛型型別參數將只能訪問System.object類型中的公有方法。“顯示約束”由Where子句表達,可以指定“基類約束”、“介面約束”、“構造器約束”、“實值型別/參考型別約束”
/************基類約束*****************/
class A
{
public void F1() { }
}
class B
{
public void F2() { }
}
class C<S, T>
where S : A //S繼承自A
where T : B //T繼承自B
{
//可以在類型為S的變數上調用F1,
//可以在類型為T的變數上調用F2
}
/***********介面約束********************/
interface IPrIntable
{
void PrInt();
}
interface IComparable<T> { int CompareTo(T v);}
interface IkeyProvider<T> { T GetKey();}
class Dictionary<K, V> where K:IComparable<K> where V: IPrIntable,IkeyProvider<K>
{
//可以在類型為K的變數上條用CompareTo,可以在類型為V的變數上調用PrInt和GetKey
}
/*************構造器約束************************/
class A { public A() { } }
class B { public B(int i) { } }
class C<T> where T:new()
{
//可以在其中使用 T t=new T();
}
C<A> c = new C<A>();//可以;A有無參數的建構函式
C<B> c = new C<B>();//不可以,B沒有無參數的建構函式
/*************值/參考型別約束*********************/
public struct A { }
public class B { }
class C<T> where T : struct
{
//T在這裡是一個實值型別
}
C<A> c = new C<A>(); //可以,A是一個實值型別
C<B> c = new C<B>();//不可以,B是一個參考型別