本文將詳細介紹C# 泛型的限制:引用型別約束;值型別約束;建構子型別約束;轉換型別約束;組合約束的相關知識。具有很好的參考價值,下面跟著小編一起來看下吧
1.引用型別約束
struct RefSample
表示對於的約束必須為一個類別(引用類型)不能是值類型(int,char,datatime,struct),可以是介面interface
區分,陣列為引用類型,因為定義數組時需要new出一個物件。
雖然定義成RefSample
2.值類型限制
#class ValSample
#為引用類型,因為int,char等型別都是struct
#ValSample
3.建構子類型限制
public T CreateInstance<T>() where T:new() { return new T(); }
指定的類型T必須有建構函數,CreateInstance
4.轉換類型約束
一種約束允許你指定另一個類型,型別實參必須可以透過一致性、引用或裝箱轉換隱含地轉換為該類型。你也可以規定一個型別實參必須可以轉換為另一個型別實參-這稱為型別參數約束。
理解的意思:可以互換,就是我們可以透過裝箱或強制型別轉換成目標型別的 型別都可以用於型別參數傳入。
class Sample
有效:Sample
#無效:Sample
struct Sample
#規定T必須為IDisposable 類型的參考類型
有效:Sample
無效:Sample
#分析:為什麼SqlConnection 可以而StringBuilder不可以?它們都是引用型別
1.SqlConnection實作了IDisposable接口,所以可以協變
##2.StringBuilder只實作了ISerializable接口,無法透過途徑轉換為IDisposable
class Sample
typeof(IComparable
無效:Sample
也可以指定多種限制:
class sample
#class Sample< T,U> where T:U有效:Sample
無效:Sample
#總結:要看傳入類別參數是否可以轉換,查看規定參數和傳入類別參數是否實現同一接口,如果實作則可以,否則不可以。
不可以是以下:System.Object,System.Enum,System.ValueType,System.Delegate,結構或密封類別(String)
5.組合約束對型別參數的限制有多個,注意:只能是一種型,值型別和參考型別不能同時存在,沒用一個型別就是引用型別,又是值型別。
由於每個值類型都有一個無建構函數,此後不能再有建構子約束
有效:
class Sample
class Sample
無效:
class Sample
class Sample
class Sample
class Sample
class Sample
class Sample< ;T,U> where T:struct where U:Class,T (類型形參「T」有「struct」約束,因此「T」不能用作「U」的約束,所以為無效的)
class Sample
看到網路上還有這種版本也是有效的我表示不理解:
class Sample
class Sample
希望可以指正
# 以上就是C# 泛型的約束圖文詳細介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!