C 五大泛型約束

2021-10-20 12:26:44 字數 3801 閱讀 5329

原文引用自此鏈結

c#五大泛型約束:

基類約束、介面約束、new()建構函式約束、引用/值型別約束、組合約束

1.基類約束

在使用泛型類時,型別可以是基類本身,也可以是繼承此基類的派生類

using system;

using system.collections.generic;

class

program);

pupillist.

add(

newpupil()

);console.

writeline

(pupillist.studentlist[0]

.english)

; studentlist.

add(

newpupil()

);studentlist.

add(

newpupil()

);console.

writeline((

(pupil)

(studentlist.studentlist[0]

)).english)

;//注意括號的新增}}

enum gender

//學生基類

class

studentbase

public

string name

public

gender gender

}//派生自學生基類的小學生類

class

pupil

:studentbase

public

int math

public

int english

}//這並不是繼承,這是泛型約束

class

studentlist

where t : studentbase //基類約束 t : 基類名

public

void

delete

(t t)

}

2.介面約束

介面約束是指某個型別必須實現指定的介面。下面乙個很簡單的例子用來說明:

using system;

}//介面約束

public

class

compare

where t : icomparable

else}}

}

3.new()建構函式約束

new()約束要求型別實參必須提供乙個無引數的公有建構函式。使用new()約束時,可以通過呼叫該無引數的建構函式來建立物件。new()建構函式約束的形式為:

where t:new ()

使用new()約束時應當注意3點:

a.new()約束可以與其他約束一起使用,但必須位於約束列表的末端

b.new()約束僅允許開發人員使用無引數的建構函式構造物件,即使同時存在其他的建構函式也是如此。

c.不可以同時使用new()約束和值型別約束。因為值型別和new()都隱式的提供了乙個無參公共建構函式。

class

pupil

:studentbase

public

pupil()

public

int chinese

public

int math

public

int english

}

4.引用/值型別約束

引用/值型別約束將一般型別引數約束為引用型別或值型別。

struct 約束將一般型別引數約束為值型別(例如,int、bool 和 enum);

class

awhere t :

struct

class 約束將一般型別引數約束為引用型別(類)

class

awhere t :

class

5.組合約束

以上各種泛型約束可以進行組合,形成組合約束。組合約束要按一定順序才能符合要求,它的第一項必須是引用/值型別約束或基類約束,接下來是介面約束,最後是new()約束。

擴充套件:在 c# 語言中提供了 icomparer 和 icomparable 介面比較集合中的物件值,主要用於對集合中的元素排序。

icomparer 介面用於在乙個單獨的類中實現,用於比較任意兩個物件。

icomparable 介面用於在要比較的物件的類中實現,可以比較任意兩個物件。

//icomparer 介面

using system;

using system.collections.generic;

hero hero1 =

newhero

("male",1

);//也可以對任意兩個hero類進行比較

hero hero2 =

newhero

("male",1

);herosort herosort =

newherosort()

;int i=herosort.

compare

(hero1, hero2)

; console.

writeline

(i);

console.

readkey()

;}}///

///在乙個單獨的類中實現icomparer

/// 此處的排序規則:先排性別,後排武力值,男性在前,武力值大的在前

///

class

herosort

:icomparer

else

}else}}

class

hero

public

int strength

public

hero

(string gender,

int strength)

}}

//icomparable介面

using system;

using system.collections.generic;

hero hero1 =

newhero

("male",1

);//也可以對任意兩個hero類進行比較

hero hero2 =

newhero

("male",1

);int i= hero1.

compareto

(hero2)

; console.

writeline

(i);

console.

readkey()

;}}///

///與icomparer在乙個單獨的類中實現不同,icomparable需要在要比較的類中實現

/// 排序規則:先排性別,後排武力值,男性在前,武力值大的在前

///

class

hero

:icomparable

public

int strength

public

hero

(string gender,

int strength)

public

intcompareto

(hero other)

else

}else}}

}

泛型五大約束

泛型型別約束 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 泛型的型別約束 public inte ce...

c 泛型約束

在定義泛型類時,可以對客戶端 能夠在例項化類時用於型別引數的型別種類施加限制。如果客戶端 嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。這些限制稱為約束。約束是使用 where 上下文關鍵字指定的。下表列出了六種型別的約束 約束說明 t struct 型別引數必須是值型別。可以指定除...

C 泛型約束

約束告知編譯器型別引數必須具備的功能。在沒有任何約束的情況下,型別引數可以是任何型別。編譯器只能假定 system.object 的成員,它是任何 net 型別的最終基類。有關詳細資訊,請參閱使用約束的原因。如果客戶端 嘗試使用約束所不允許的型別來例項化類,則會產生編譯時錯誤。通過使用where上下...