泛型方法的重寫
abstract class Base
{
public abstract T F(T t,U u) where U : T;
public abstract T G(T t) where U : IComparable;
}
class Derived:Base
{
// 合法的重寫,約束被默認繼承
public override X F(X,Y)(X x,Y y){}
// 非法的重寫,指定任何約束都是多余的
public override T G(T t) where T : Comparable{}
}
泛型約束簡介
C#泛型要求對"所有泛型類型或泛型方法的類型參數"的任何假定,都要基於"顯式的約束",以維護C#所要求的類型安全.
"顯式約束"有where字句表達,可以指定"基類約束","接口約束","構造器約束","值類型/引用類型約束"共四中約束.
"顯示約束"並非必須,如果沒有指定"顯式約束",泛型類型參數將只能訪問System.Object類型中的公有方法.
基類約束
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{coid Print(); }
interface IComparable{int CompareTo(T v); }
interface IKeyProvider{T HetKey(); }
class Dictionary
where K:IComparable
where V:IPrintable,IKeyProvider
{
// 可以在類型為K的變量上調用CompareTo
// 可以在類型為V的變量上調用Print和GetKey
}