C# 泛型的約束
1.引用類型約束
struct RefSample<T> where T:class 引用類型用Class表示約束,其他的引用類型為具體的約束。
表示對于的約束必須為一個類(引用類型)不能是值類型(int,char,datatime,struct),可以是接口interface
區(qū)分,數(shù)組為引用類型,因為定義數(shù)組時需要new出一個對象。
雖然定義成 RefSample<T> 傳入的必須為引用類型 但是RefSample仍然為值類型
2.值類型約束
class ValSample<T> where T:struct
為引用類型,因為int,char等類型都是struct
ValSample<int>
3.構(gòu)造函數(shù)類型約束
public T CreateInstance<T>() where T:new()
{
return new T();
}
指定的類型T必須有構(gòu)造函數(shù),CreateInstance<int>和CreateInstance<object> 都是有效的。但是CreateInstance<strings>沒有構(gòu)造函數(shù)。
4.轉(zhuǎn)換類型約束
一種約束允許你指定另一個類型,類型實參必須可以通過一致性、引用或裝箱轉(zhuǎn)換隱式地轉(zhuǎn)換為該類型。你還可以規(guī)定一個類型實參必須可以轉(zhuǎn)換為另一個類型實參——這稱為類型參數(shù)約束。
理解的意思:可以互換,就是我們可以通過裝箱或者強制類型轉(zhuǎn)換成目標類型的 類型都可以用于類型參數(shù)傳入。
class Sample<T> where T:Stream
有效:Sample<Stream> 這本身符合約束
無效:Sample<String> 因為String類型無法通過引用或者裝箱拆箱強制轉(zhuǎn)換成Stream、
struct Sample<T> where T:IDisposable
規(guī)定T必須為IDisposable 類型的 引用類型
有效:Sample<SqlConnection>引用轉(zhuǎn)換
無效:Sample<StringBuilder>
分析:為什么SqlConnection 可以而StringBuilder不可以?它們都是引用類型
1.SqlConnection實現(xiàn)了IDisposable接口,所以可以協(xié)變
2.StringBuilder只實現(xiàn)了ISerializable接口,無法通過途徑轉(zhuǎn)換為IDisposable
class Sample<T> where T:IComparable<T>
因為將IComparable<T>整體當作約束,分析IComparable<T>的類型,可以用Type.IsValueType判斷,true為值類型,false為引用類型
typeof(IComparable<T>).IsValueType 結(jié)果為false表示為引用類型
有效:Sample<int>(裝箱轉(zhuǎn)換)
無效:Sample<FileInfo>
也可以指定多種約束:
class sample<T> where T:stream,IEnumerable<string>,IComparable<int>
class Sample<T,U> where T:U
有效:Sample<Stream,IDisposable>
無效:Sample<string,IDiposable>
總結(jié):要看傳入類參數(shù)是否可以轉(zhuǎn)換,查看規(guī)定參數(shù)和傳入類參數(shù)是否實現(xiàn)同一接口,如果實現(xiàn)則可以,否則不可以。
不可以是以下:System.Object,System.Enum,System.ValueType,System.Delegate,結(jié)構(gòu)或密封類(String)
5.組合約束
對類型參數(shù)的約束有多個,注意:只能是一種類型,值類型和引用類型不能同時存在,沒用一個類型即是引用類型,又是值類型。
由于每一個值類型都有一個無構(gòu)造函數(shù),此后不能再有構(gòu)造函數(shù)約束
有效:
class Sample<T> where T:class,IDisposable,new()
class Sample<T,U> where T:Stream where U:IDispsable
無效:
class Sample<T> where T:class,struct (沒有任何類型即時引用類型又是值類型的,所以為無效的)
class Sample<T> where T:Stream,class (引用類型約束應該為第一個約束,放在最前面,所以為無效的) Stream只是約束傳入?yún)?shù)為Stream具體類型,而class約束為引用類型,一開始我理解錯了
class Sample<T> where T:new(),Stream (new() 必須放在最后)
class Sample<T> where T:IDisposable,Stream (類必須放在接口前面,所以為無效的)
class Sample<T> where T:XmlReader,IComparable,IComparable (對于轉(zhuǎn)換類型約束,同一個接口不能出現(xiàn)多次)
class Sample<T,U> where T:struct where U:Class,T (類型形參“T”具有“struct”約束,因此“T”不能用作“U”的約束,所以為無效的)
class Sample<T,U> where T:Stream ,U:IDisposable 語法錯誤
看到網(wǎng)上還有這種版本也是有效的我表示不理解:
class Sample<T> where T:struct,IDisapsable IDisapsable為值類型?
class Sample<T,U> where T:class where U:struct ,T T為引用類型為何與值類型一起約束U?
希望可以指正
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持我們!
欄 目:C#教程
下一篇:完成OSS.Http底層HttpClient重構(gòu)封裝 支持標準庫
本文標題:C# 泛型的約束
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5915.html
您可能感興趣的文章
- 01-10C#通過反射獲取當前工程中所有窗體并打開的方法
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線程的方法
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新聞效果的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實現(xiàn)多線程下載文件的方法


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻播放器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設置


