程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 泛型的約束

C# 泛型的約束

編輯:C#入門知識

C# 泛型的約束。本站提示廣大學習愛好者:(C# 泛型的約束)文章只能為提供參考,不一定能成為您想要的結果。以下是C# 泛型的約束正文


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

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接口,所以可以協變

2.StringBuilder只完成了ISerializable接口,無法經過途徑轉換為IDisposable

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?

希望可以指正

以上就是本文的全部內容,希望本文的內容對大家的學習或許任務能帶來一定的協助,同時也希望多多支持!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved