C# 泛型約束

2018-01-16 02:54 更新

C#泛型約束

默認情況下,類型參數(shù)可以用任何類型替換。

約束可以應(yīng)用于類型參數(shù),以需要更具體的類型參數(shù)。

這些是可能的約束:

where T : base-class // Base-class constraint 
where T : interface  // Interface constraint 
where T : class      // Reference-type constraint 
where T : struct     // Value-type constraint (excludes Nullable types) 
where T : new()      // Parameterless constructor constraint 
where U : T          // Naked type constraint 

例子

在下面的例子中,GenericClass <T,U>要求T從Main派生并實現(xiàn)Interface1,并且要求U提供一個無參數(shù)的構(gòu)造函數(shù):

class Main {} 
interface Interface1 {} 

class GenericClass<T,U> where T : Main, Interface1
where U : new() {
  ...
} 

注意

約束可以應(yīng)用于在方法和類型定義中定義類型參數(shù)的任何位置。

基類約束指定type參數(shù)必須對特定類進行子類化。

接口約束指定type參數(shù)必須實現(xiàn)該接口。

以下代碼顯示了如何編寫一個通用Max方法,該方法最多返回兩個值。

我們可以使用在框架中定義的通用接口IComparable <T>:

public interface IComparable<T> // Simplified version of interface 
{
    int CompareTo (T other); 
} 

下面的代碼使用IComparable接口作為約束,我們可以寫一個Max方法如下:

static T Max <T> (T a, T b) where T : IComparable<T> {
    return a.CompareTo (b) > 0 ? a : b; 
} 

Max方法可以接受任何類型的實現(xiàn)IComparable <T>的參數(shù):

int z = Max (5, 10); // 10 
string last = Max ("A", "B");

子類化泛型類型

泛型類可以像非類類一樣子類化。

子類可以保持基類的類型參數(shù)打開,如下例所示:

class Stack<T> {...} 
class SpecialStack<T> : Stack<T> {...} 

或者子類可以使用具體類型關(guān)閉泛型類型參數(shù):

class IntStack : Stack<int> {...} 

一個子類型還可以引入新的類型參數(shù):

class List<T> {...} 
class KeyedList<T,TKey> : List<T> {...} 
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號