C# 泛型的約束
1.引用類(lèi)型約束
struct RefSample<T> where T:class 引用類(lèi)型用Class表示約束,其他的引用類(lèi)型為具體的約束。
表示對(duì)于的約束必須為一個(gè)類(lèi)(引用類(lèi)型)不能是值類(lèi)型(int,char,datatime,struct),可以是接口interface
區(qū)分,數(shù)組為引用類(lèi)型,因?yàn)槎x數(shù)組時(shí)需要new出一個(gè)對(duì)象。
雖然定義成 RefSample<T> 傳入的必須為引用類(lèi)型 但是RefSample仍然為值類(lèi)型
2.值類(lèi)型約束
class ValSample<T> where T:struct
為引用類(lèi)型,因?yàn)閕nt,char等類(lèi)型都是struct

ValSample<int>
3.構(gòu)造函數(shù)類(lèi)型約束
public T CreateInstance<T>() where T:new()
{
return new T();
}
指定的類(lèi)型T必須有構(gòu)造函數(shù),CreateInstance<int>和CreateInstance<object> 都是有效的。但是CreateInstance<strings>沒(méi)有構(gòu)造函數(shù)。
4.轉(zhuǎn)換類(lèi)型約束
一種約束允許你指定另一個(gè)類(lèi)型,類(lèi)型實(shí)參必須可以通過(guò)一致性、引用或裝箱轉(zhuǎn)換隱式地轉(zhuǎn)換為該類(lèi)型。你還可以規(guī)定一個(gè)類(lèi)型實(shí)參必須可以轉(zhuǎn)換為另一個(gè)類(lèi)型實(shí)參——這稱(chēng)為類(lèi)型參數(shù)約束。
理解的意思:可以互換,就是我們可以通過(guò)裝箱或者強(qiáng)制類(lèi)型轉(zhuǎn)換成目標(biāo)類(lèi)型的 類(lèi)型都可以用于類(lèi)型參數(shù)傳入。
class Sample<T> where T:Stream
有效:Sample<Stream> 這本身符合約束
無(wú)效:Sample<String> 因?yàn)镾tring類(lèi)型無(wú)法通過(guò)引用或者裝箱拆箱強(qiáng)制轉(zhuǎn)換成Stream、
struct Sample<T> where T:IDisposable
規(guī)定T必須為IDisposable 類(lèi)型的 引用類(lèi)型
有效:Sample<SqlConnection>引用轉(zhuǎn)換
無(wú)效:Sample<StringBuilder>
分析:為什么SqlConnection 可以而StringBuilder不可以?它們都是引用類(lèi)型
1.SqlConnection實(shí)現(xiàn)了IDisposable接口,所以可以協(xié)變


2.StringBuilder只實(shí)現(xiàn)了ISerializable接口,無(wú)法通過(guò)途徑轉(zhuǎn)換為IDisposable

class Sample<T> where T:IComparable<T>
因?yàn)閷Comparable<T>整體當(dāng)作約束,分析IComparable<T>的類(lèi)型,可以用Type.IsValueType判斷,true為值類(lèi)型,false為引用類(lèi)型
typeof(IComparable<T>).IsValueType 結(jié)果為false表示為引用類(lèi)型
有效:Sample<int>(裝箱轉(zhuǎn)換)
無(wú)效:Sample<FileInfo>
也可以指定多種約束:
class sample<T> where T:stream,IEnumerable<string>,IComparable<int>
class Sample<T,U> where T:U
有效:Sample<Stream,IDisposable>
無(wú)效:Sample<string,IDiposable>
總結(jié):要看傳入類(lèi)參數(shù)是否可以轉(zhuǎn)換,查看規(guī)定參數(shù)和傳入類(lèi)參數(shù)是否實(shí)現(xiàn)同一接口,如果實(shí)現(xiàn)則可以,否則不可以。
不可以是以下:System.Object,System.Enum,System.ValueType,System.Delegate,結(jié)構(gòu)或密封類(lèi)(String)
5.組合約束
對(duì)類(lèi)型參數(shù)的約束有多個(gè),注意:只能是一種類(lèi)型,值類(lèi)型和引用類(lèi)型不能同時(shí)存在,沒(méi)用一個(gè)類(lèi)型即是引用類(lèi)型,又是值類(lèi)型。
由于每一個(gè)值類(lèi)型都有一個(gè)無(wú)構(gòu)造函數(shù),此后不能再有構(gòu)造函數(shù)約束
有效:
class Sample<T> where T:class,IDisposable,new()
class Sample<T,U> where T:Stream where U:IDispsable
無(wú)效:
class Sample<T> where T:class,struct (沒(méi)有任何類(lèi)型即時(shí)引用類(lèi)型又是值類(lèi)型的,所以為無(wú)效的)
class Sample<T> where T:Stream,class (引用類(lèi)型約束應(yīng)該為第一個(gè)約束,放在最前面,所以為無(wú)效的) Stream只是約束傳入?yún)?shù)為Stream具體類(lèi)型,而class約束為引用類(lèi)型,一開(kāi)始我理解錯(cuò)了
class Sample<T> where T:new(),Stream (new() 必須放在最后)
class Sample<T> where T:IDisposable,Stream (類(lèi)必須放在接口前面,所以為無(wú)效的)
class Sample<T> where T:XmlReader,IComparable,IComparable (對(duì)于轉(zhuǎn)換類(lèi)型約束,同一個(gè)接口不能出現(xiàn)多次)
class Sample<T,U> where T:struct where U:Class,T (類(lèi)型形參“T”具有“struct”約束,因此“T”不能用作“U”的約束,所以為無(wú)效的)
class Sample<T,U> where T:Stream ,U:IDisposable 語(yǔ)法錯(cuò)誤
看到網(wǎng)上還有這種版本也是有效的我表示不理解:
class Sample<T> where T:struct,IDisapsable IDisapsable為值類(lèi)型?
class Sample<T,U> where T:class where U:struct ,T T為引用類(lèi)型為何與值類(lèi)型一起約束U?
希望可以指正
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
- C#泛型的使用及示例詳解
- C#泛型詳解及關(guān)鍵字作用
- C#泛型運(yùn)作原理的深入理解
- C# 泛型集合的自定義類(lèi)型排序的實(shí)現(xiàn)
- 詳解c# 泛型類(lèi)的功能
- 詳細(xì)介紹C# 泛型
- 詳解C#泛型的類(lèi)型參數(shù)約束
- 詳解C# 泛型中的數(shù)據(jù)類(lèi)型判定與轉(zhuǎn)換
- C#泛型類(lèi)型知識(shí)講解
- C#語(yǔ)法之泛型的多種應(yīng)用
- C#泛型設(shè)計(jì)需要注意的一個(gè)小陷阱
- C#泛型概念的簡(jiǎn)介與泛型的使用
- C#泛型類(lèi)創(chuàng)建與使用的方法
- C# 泛型接口的抗變和協(xié)變
- C# 泛型參數(shù)轉(zhuǎn)換
- c#中的泛型委托詳解
- C#的泛型方法解析
- C#泛型詳解
相關(guān)文章
c# 多線程環(huán)境下控制對(duì)共享資源訪問(wèn)的解決方法
這篇文章主要介紹了c# 多線程環(huán)境下控制對(duì)共享資源訪問(wèn)的解決方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07
c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡(jiǎn)單)
下面小編就為大家分享一篇c# 獲得當(dāng)前絕對(duì)路徑的方法(超簡(jiǎn)單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
C#仿QQ實(shí)現(xiàn)簡(jiǎn)單的截圖功能
這篇文章主要為大家詳細(xì)介紹了如何利用C#語(yǔ)言模擬QQ實(shí)現(xiàn)屏幕選擇區(qū)域截圖功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08
C#使用Jquery zTree實(shí)現(xiàn)樹(shù)狀結(jié)構(gòu)顯示 異步數(shù)據(jù)加載
這篇文章主要為大家詳細(xì)介紹了C#使用Jquery zTree實(shí)現(xiàn)樹(shù)狀結(jié)構(gòu)顯示和異步數(shù)據(jù)加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
C#驗(yàn)證控件validator的簡(jiǎn)單使用
這篇文章主要介紹了C#驗(yàn)證控件validator的簡(jiǎn)單使用方法和示例,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-06-06
基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022
基于 C# 的 圖表控件庫(kù) ScottPlot,開(kāi)源免費(fèi),可以用于開(kāi)發(fā)一些上位機(jī)軟件,如電壓、電流波形的顯示,開(kāi)發(fā)【示波器】圖形界面,可以顯示一些圖表、波形,總之功能比較的強(qiáng)大,本文介紹了基于C#的圖表控件庫(kù) ScottPlot編譯visual studio 2022,需要的朋友可以參考下2022-06-06

