国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# 泛型的約束

2019-10-29 21:14:08
字體:
來源:轉載
供稿:網友

1.引用類型約束

struct RefSample<T> where T:class         引用類型用Class表示約束,其他的引用類型為具體的約束。

表示對于的約束必須為一個類(引用類型)不能是值類型(int,char,datatime,struct),可以是接口interface

區分,數組為引用類型,因為定義數組時需要new出一個對象。

雖然定義成 RefSample<T> 傳入的必須為引用類型 但是RefSample仍然為值類型

2.值類型約束

class ValSample<T> where T:struct

為引用類型,因為int,char等類型都是struct

C#,泛型,約束

ValSample<int>

3.構造函數類型約束

public T CreateInstance<T>() where T:new(){  return new T();}

指定的類型T必須有構造函數,CreateInstance<int>和CreateInstance<object> 都是有效的。但是CreateInstance<strings>沒有構造函數。

4.轉換類型約束

一種約束允許你指定另一個類型,類型實參必須可以通過一致性、引用或裝箱轉換隱式地轉換為該類型。你還可以規定一個類型實參必須可以轉換為另一個類型實參——這稱為類型參數約束。

理解的意思:可以互換,就是我們可以通過裝箱或者強制類型轉換成目標類型的 類型都可以用于類型參數傳入。

class Sample<T> where T:Stream

有效:Sample<Stream> 這本身符合約束

無效:Sample<String> 因為String類型無法通過引用或者裝箱拆箱強制轉換成Stream、

struct Sample<T> where T:IDisposable

規定T必須為IDisposable 類型的 引用類型

有效:Sample<SqlConnection>引用轉換

無效:Sample<StringBuilder>

分析:為什么SqlConnection 可以而StringBuilder不可以?它們都是引用類型

1.SqlConnection實現了IDisposable接口,所以可以協變

C#,泛型,約束

C#,泛型,約束

2.StringBuilder只實現了ISerializable接口,無法通過途徑轉換為IDisposable

C#,泛型,約束

class Sample<T> where T:IComparable<T>

因為將IComparable<T>整體當作約束,分析IComparable<T>的類型,可以用Type.IsValueType判斷,true為值類型,false為引用類型

typeof(IComparable<T>).IsValueType   結果為false表示為引用類型

有效:Sample<int>(裝箱轉換)

無效: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>

總結:要看傳入類參數是否可以轉換,查看規定參數和傳入類參數是否實現同一接口,如果實現則可以,否則不可以。

不可以是以下:System.Object,System.Enum,System.ValueType,System.Delegate,結構或密封類(String)

5.組合約束

對類型參數的約束有多個,注意:只能是一種類型,值類型和引用類型不能同時存在,沒用一個類型即是引用類型,又是值類型。

由于每一個值類型都有一個無構造函數,此后不能再有構造函數約束

有效:

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只是約束傳入參數為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 (對于轉換類型約束,同一個接口不能出現多次

class Sample<T,U> where T:struct where  U:Class,T (類型形參“T”具有“struct”約束,因此“T”不能用作“U”的約束,所以為無效的)

class Sample<T,U> where T:Stream ,U:IDisposable  語法錯誤

看到網上還有這種版本也是有效的我表示不理解:

class Sample<T> where T:struct,IDisapsable  IDisapsable為值類型?

class Sample<T,U> where T:class where U:struct ,T   T為引用類型為何與值類型一起約束U?

希望可以指正

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持VEVB武林網!


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿荣旗| 柞水县| 阿克陶县| 宕昌县| 洪湖市| 临朐县| 冀州市| 湖北省| 琼海市| 台北市| 大洼县| 江永县| 米易县| 玉门市| 巴塘县| 利川市| 休宁县| 浙江省| 洛扎县| 南华县| 浦城县| 石渠县| 禄丰县| 普安县| 岚皋县| 铁力市| 凯里市| 焦作市| 南召县| 景洪市| 高密市| 富锦市| 平谷区| 乌鲁木齐县| 石城县| 彰化市| 洱源县| 泸西县| 盐边县| 广东省| 海伦市|