原文引用自此鏈結
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上下...