位置:首頁 > 軟件操作教程 > 編程開發(fā) > C# > 問題詳情

C# 定義泛型方法

提問人:劉團圓發(fā)布時間:2020-12-08

上個示例中使用了方法GetCows()。在討論這個示例時也提到,可以使用泛型方法得到這個方法的更—般形式。在泛型方法中,返回類型和/或參數(shù)類型由泛型類型參數(shù)來確定。例如:

    public T GetDefault<T>() => default(T);

這個小示例使用前面介紹的default關(guān)鍵字,為類型T返回默認值。對這個方法的調(diào)用如下所示:

    int myDefaultlnt = GetDefault<int> ();

在調(diào)用該方法時提供了類型參數(shù)T。

這個T與用于給類提供泛型類型參數(shù)的類型差異極大。實際上,可以通過非泛型類來實現(xiàn)泛型方法:

public class Defaulter 

{

    public T GetDefault<T>() => default(T);

}

但如果類是泛型的,就必須為泛型方法類型使用不同的標(biāo)識符。下面的代碼不會編譯:

public class Defaulter<T>

{

    public T GetDefault<T>() => default(T);

}

必須重命名方法或類使用的類型T。

泛型方法參數(shù)可以釆用與類相同的方式使用約束,在此可以使用任意的類類型參數(shù),例如:

public class Defaulter<Tl>

{

    public T2 GetDefault<T2>() 

        where T2 : T1

    {

        return default(T2);

    }

}

其中,為方法提供的類型T2必須與給類提供的T1相同,或者繼承自T1。這是約束泛型方法的常用方式。在前面的Farm<T>類中,可以包含下面的方法(在Chl2Ex04的下載代碼中包含它們,但己注釋掉)。

public Farm<U> GetSpecies<U>() where U : T 

{

    Farm<U> speciesFarm = new Farm<U>(); 

    foreach (T animal in animals)

    {

        if (animal is U)

        {

            speciesFarm.Animals.Add(animal as U);

        }

    }

    return speciesFarm;

}

這可以替代GetCowsO和相同類型的其他方法。這里使用的泛型類型參數(shù)U由T約束,T又由Farm<I>類約束為Animal。因此,如果愿意,可以把T的實例視為Animal的實例。

在Chl2Ex04的客戶端代碼Program.cs中,使用這個新方法需要進行一處修改:

    Farm<Cow> dairyFarm = farm.GetSpecies<Cow>();

也可以編寫如下代碼:

    Farm<Chicken> poultryFarm = farm.GetSpecies<Chicken>();

對于繼承自Animal的其他類,都可以使用這種方法。

這里要注意,如果某個方法有泛型類型參數(shù),會改變該方法的簽名。也就是說,該方法有幾個重載版本,它們僅在泛型類型參數(shù)上有區(qū)別。例如:

    public void ProcessT<T>(T opl){ ... } 

    public void ProcessT<T, U>(T opl){ ... }

使用哪個方法取決于調(diào)用方法時指定的泛型類型參數(shù)的個數(shù)。

繼續(xù)查找其他問題的答案?

相關(guān)視頻回答
回復(fù)(0)
返回頂部