日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > C# >内容正文

C#

C# 泛型类型参数的约束

發(fā)布時(shí)間:2025/4/14 C# 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 泛型类型参数的约束 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

C# 泛型類(lèi)型參數(shù)的約束

http://www.cnblogs.com/rinack/p/5676311.html
在定義泛型類(lèi)時(shí),可以對(duì)客戶端代碼能夠在實(shí)例化類(lèi)時(shí)用于類(lèi)型參數(shù)的類(lèi)型種類(lèi)施加限制。如果客戶端代碼嘗試使用某個(gè)約束所不允許的類(lèi)型來(lái)實(shí)例化類(lèi),則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。這些限制稱(chēng)為約束。約束是使用 where 上下文關(guān)鍵字指定的。下表列出了六種類(lèi)型的約束:


where T: struct
類(lèi)型參數(shù)必須是值類(lèi)型。可以指定除 Nullable 以外的任何值類(lèi)型。有關(guān)更多信息,請(qǐng)參見(jiàn)使用可以為 null 的類(lèi)型(C# 編程指南)。
where T : class
類(lèi)型參數(shù)必須是引用類(lèi)型;這一點(diǎn)也適用于任何類(lèi)、接口、委托或數(shù)組類(lèi)型。
where T:new()
類(lèi)型參數(shù)必須具有無(wú)參數(shù)的公共構(gòu)造函數(shù)。當(dāng)與其他約束一起使用時(shí),new() 約束必須最后指定。
where T:<基類(lèi)名>
類(lèi)型參數(shù)必須是指定的基類(lèi)或派生自指定的基類(lèi)。
where T:<接口名稱(chēng)>
類(lèi)型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口。可以指定多個(gè)接口約束。約束接口也可以是泛型的。
where T:U
為 T 提供的類(lèi)型參數(shù)必須是為 U 提供的參數(shù)或派生自為 U 提供的參數(shù)。

使用約束的原因 ?
?
如果要檢查泛型列表中的某個(gè)項(xiàng)以確定它是否有效,或者將它與其他某個(gè)項(xiàng)進(jìn)行比較,則編譯器必須在一定程度上保證它需要調(diào)用的運(yùn)算符或方法將受到客戶端代碼可能指定的任何類(lèi)型參數(shù)的支持。這種保證是通過(guò)對(duì)泛型類(lèi)定義應(yīng)用一個(gè)或多個(gè)約束獲得的。例如,基類(lèi)約束告訴編譯器:僅此類(lèi)型的對(duì)象或從此類(lèi)型派生的對(duì)象才可用作類(lèi)型參數(shù)。一旦編譯器有了這個(gè)保證,它就能夠允許在泛型類(lèi)中調(diào)用該類(lèi)型的方法。約束是使用上下文關(guān)鍵字 where 應(yīng)用的。

public class Employee {private string name;private int id;public Employee(string s, int i){name = s;id = i;}public string Name{get { return name; }set { name = value; }}public int ID{get { return id; }set { id = value; }} }public class GenericList<T> where T : Employee {private class Node{private Node next;private T data;public Node(T t){next = null;data = t;}public Node Next{get { return next; }set { next = value; }}public T Data{get { return data; }set { data = value; }}}private Node head;public GenericList() //constructor{head = null;}public void AddHead(T t){Node n = new Node(t);n.Next = head;head = n;}public IEnumerator<T> GetEnumerator(){Node current = head;while (current != null){yield return current.Data;current = current.Next;}}public T FindFirstOccurrence(string s){Node current = head;T t = null;while (current != null){//The constraint enables access to the Name property.if (current.Data.Name == s){t = current.Data;break;}else{current = current.Next;}}return t;} }

約束使得泛型類(lèi)能夠使用 Employee.Name 屬性,因?yàn)轭?lèi)型為 T 的所有項(xiàng)都保證是 Employee 對(duì)象或從 Employee 繼承的對(duì)象。
可以對(duì)同一類(lèi)型參數(shù)應(yīng)用多個(gè)約束,并且約束自身可以是泛型類(lèi)型,如下所示:

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
? ? // ...
}
?
通過(guò)約束類(lèi)型參數(shù),可以增加約束類(lèi)型及其繼承層次結(jié)構(gòu)中的所有類(lèi)型所支持的允許操作和方法調(diào)用的數(shù)量。因此,在設(shè)計(jì)泛型類(lèi)或方法時(shí),如果要對(duì)泛型成員執(zhí)行除簡(jiǎn)單賦值之外的任何操作或調(diào)用 System.Object 不支持的任何方法,您將需要對(duì)該類(lèi)型參數(shù)應(yīng)用約束。
在應(yīng)用 where T : class 約束時(shí),避免對(duì)類(lèi)型參數(shù)使用 == 和 != 運(yùn)算符,因?yàn)檫@些運(yùn)算符僅測(cè)試引用同一性而不測(cè)試值相等性。即使在用作參數(shù)的類(lèi)型中重載這些運(yùn)算符也是如此。下面的代碼說(shuō)明了這一點(diǎn);即使 String 類(lèi)重載 == 運(yùn)算符,輸出也為 false。

public static void OpTest<T>(T s, T t) where T : class {System.Console.WriteLine(s == t); } static void Main() {string s1 = "target";System.Text.StringBuilder sb = new System.Text.StringBuilder("target");string s2 = sb.ToString();OpTest<string>(s1, s2); }
這種情況的原因在于,編譯器在編譯時(shí)僅知道 T 是引用類(lèi)型,因此必須使用對(duì)所有引用類(lèi)型都有效的默認(rèn)運(yùn)算符。如果必須測(cè)試值相等性,建議的方法是同時(shí)應(yīng)用 where T : IComparable<T> 約束,并在將用于構(gòu)造泛型類(lèi)的任何類(lèi)中實(shí)現(xiàn)該接口。

約束多個(gè)參數(shù)

可以對(duì)多個(gè)參數(shù)應(yīng)用約束,并對(duì)一個(gè)參數(shù)應(yīng)用多個(gè)約束,如下面的示例所示:

class Base { }
class Test<T, U>
? ? where U : struct

? ? where T : Base, new() { }


未綁定的類(lèi)型參數(shù)

沒(méi)有約束的類(lèi)型參數(shù)(如公共類(lèi) SampleClass<T>{} 中的 T)稱(chēng)為未綁定的類(lèi)型參數(shù)。未綁定的類(lèi)型參數(shù)具有以下規(guī)則:

不能使用 != 和 == 運(yùn)算符,因?yàn)闊o(wú)法保證具體類(lèi)型參數(shù)能支持這些運(yùn)算符。

可以在它們與 System.Object 之間來(lái)回轉(zhuǎn)換,或?qū)⑺鼈冿@式轉(zhuǎn)換為任何接口類(lèi)型。

可以將它們與 null 進(jìn)行比較。將未綁定的參數(shù)與 null 進(jìn)行比較時(shí),如果類(lèi)型參數(shù)為值類(lèi)型,則該比較將始終返回 false。

作為約束的類(lèi)型參數(shù)

將泛型類(lèi)型參數(shù)作為約束使用,在具有自己類(lèi)型參數(shù)的成員函數(shù)必須將該參數(shù)約束為包含類(lèi)型的類(lèi)型參數(shù)時(shí)非常有用,如下示例所示:

class List<T>
{
? ? void Add<U>(List<U> items) where U : T {/*...*/}

}


在上面的示例中,T 在 Add 方法的上下文中是一個(gè)類(lèi)型約束,而在 List 類(lèi)的上下文中是一個(gè)未綁定的類(lèi)型參數(shù)。

類(lèi)型參數(shù)還可在泛型類(lèi)定義中用作約束。請(qǐng)注意,必須在尖括號(hào)中聲明此類(lèi)型參數(shù)與任何其他類(lèi)型的參數(shù):

//Type parameter V is used as a type constraint.
public class SampleClass<T, U, V> where T : V { }
泛型類(lèi)的類(lèi)型參數(shù)約束的作用非常有限,因?yàn)榫幾g器除了假設(shè)類(lèi)型參數(shù)派生自 System.Object 以外,不會(huì)做其他任何假設(shè)。在希望強(qiáng)制兩個(gè)類(lèi)型參數(shù)之間的繼承關(guān)系的情況下,可對(duì)泛型類(lèi)使用參數(shù)類(lèi)型約束。
========

泛型類(lèi)型參數(shù)及約束

http://www.cnblogs.com/wanghonghu/archive/2012/07/11/2586920.html
泛型類(lèi)型參數(shù)簡(jiǎn)介
? ? 在定義泛型類(lèi)型和泛型方法時(shí),常用到泛型類(lèi)型參數(shù),泛型類(lèi)型參數(shù)是在實(shí)例化泛型時(shí)指定類(lèi)型的占位符。泛型類(lèi)型參數(shù)放在“<>”內(nèi)。

? ? 泛型類(lèi)型參數(shù)命名建議:

? ? (1)當(dāng)泛型類(lèi)型參數(shù)為單個(gè)字母時(shí),建議用T表示。

? ? (1)當(dāng)泛型類(lèi)型參數(shù)用單詞定義時(shí),建議在單詞前加T。

private void PromptName<T>(T t) {}
private void PromptName<Tuser>(Tuser user){}
泛型類(lèi)型參數(shù)約束
? ? ? 在定義泛型類(lèi)時(shí),可以對(duì)在實(shí)例化泛型類(lèi)時(shí)用于類(lèi)型參數(shù)的類(lèi)型種類(lèi)施加限制。如果實(shí)例化泛型類(lèi)時(shí)使用某個(gè)約束所不允許的類(lèi)型來(lái)實(shí)例化類(lèi),則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。

? ? ? 泛型約束分類(lèi): ?

約束

說(shuō)明

T:結(jié)構(gòu)

類(lèi)型參數(shù)必須是值類(lèi)型。 可以指定除 Nullable 以外的任何值類(lèi)型。

T:類(lèi)

類(lèi)型參數(shù)必須是引用類(lèi)型;這一點(diǎn)也適用于任何類(lèi)、接口、委托或數(shù)組類(lèi)型。

T:new()

類(lèi)型參數(shù)必須具有無(wú)參數(shù)的公共構(gòu)造函數(shù)。 當(dāng)與其他約束一起使用時(shí),new() 約束必須最后指定。

T:<基類(lèi)名>

類(lèi)型參數(shù)必須是指定的基類(lèi)或派生自指定的基類(lèi)。

T:<接口名稱(chēng)>

類(lèi)型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口。 可以指定多個(gè)接口約束。 約束接口也可以是泛型的。

T:U

為 T 提供的類(lèi)型參數(shù)必須是為 U 提供的參數(shù)或派生自為 U 提供的參數(shù)。

?(1)類(lèi)型參數(shù)約束為結(jié)構(gòu)(struct)。

public class ShowObjectType<T> where T : struct{public void ShowValue<T>(T t){Console.WriteLine(t.GetType());}}class GenericConstraint{static void Main(){ ShowObjectType<int> showInt = new ShowObjectType<int>();showInt.ShowValue<int>(5);showInt.ShowValue(5);//從參數(shù)可以推導(dǎo)出類(lèi)型參數(shù)類(lèi)型,則可以省略類(lèi)型參數(shù)類(lèi)型//因?yàn)榧s束為值類(lèi)型,下面代碼不能通過(guò)編譯ShowObjectType<string> showString = new ShowObjectType<string>();showString.ShowValue("5");Console.Read();}}

? ?(2)類(lèi)型參數(shù)約束為類(lèi)(class)。

? ? 在應(yīng)用 where T : class 約束時(shí),避免對(duì)類(lèi)型參數(shù)使用 == 和 != 運(yùn)算符,因?yàn)檫@些運(yùn)算符僅測(cè)試類(lèi)型為引用類(lèi)型,而不測(cè)試值相等性。

class GenericConstraint{static void Main(){List<string > list = new List<string>();AddClass<string>(list, "hello generic");Console.Read();}private static void AddClass<T>(List<T> list, T t) where T : class{list.Add(t);}}
? (4)類(lèi)型參數(shù)約束為具體類(lèi)。

? ? ? ? ?約束為具體類(lèi)時(shí),可利用類(lèi)型參數(shù)調(diào)用具體類(lèi)的屬性和方法。

? ? class GenericConstraint
? ? {
? ? ? ? static void Main()
? ? ? ? {
? ? ? ? ? ? Person person = new Person { ID = 1, Name = "David" };
? ? ? ? ? ? PromptName<Person>(person);


? ? ? ? ? ? Console.Read();
? ? ? ? }


? ? ? ? //此約束T為Person對(duì)象或者繼承Person對(duì)象
? ? ? ? private static void PromptName<T>(T t) where T : Person?
? ? ? ? {
? ? ? ? ? ? //此處可使用Person的Name屬性
? ? ? ? ? ? if (t.Name == "David")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("Person name is David");
? ? ? ? ? ? }


? ? ? ? ? ? string name = t.GetName();
? ? ? ? ? ? Console.WriteLine("Person name is {0}", name);
? ? ? ? }
? ? }
? ? public class Person
? ? {
? ? ? ? private int id;
? ? ? ? public int ID
? ? ? ? {
? ? ? ? ? ? get { return id; }
? ? ? ? ? ? set { id = value; }
? ? ? ? }


? ? ? ? private string name;
? ? ? ? public string Name
? ? ? ? {
? ? ? ? ? ? get { return name; }
? ? ? ? ? ? set { name = value; }
? ? ? ? }
? ? ? ? public string GetName()
? ? ? ? {
? ? ? ? ? ? return Name;
? ? ? ? }
? ? }
復(fù)制代碼
? ? (5)約束多個(gè)參數(shù)。


class Base { }
class Test<T, U>
? ? where U : struct
? ? where T : Base, new() { }
? ? (6)未綁定類(lèi)型參數(shù)。


? ? ? 沒(méi)有約束的類(lèi)型參數(shù),稱(chēng)為未綁定的類(lèi)型參數(shù)。


class ?List<T>{}
========

泛型類(lèi)型參數(shù)約束 <T> where T : class,new(){}



.NET支持的類(lèi)型參數(shù)約束有以下五種:
where T : struct ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | T必須是一個(gè)結(jié)構(gòu)類(lèi)型
where T : class ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | T必須是一個(gè)類(lèi)(class)類(lèi)型,不能是結(jié)構(gòu)(structure)類(lèi)型 ? 引用類(lèi)型
where T : new() ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | T必須要有一個(gè)無(wú)參構(gòu)造函數(shù) ? ?可以被new()
where T : NameOfBaseClass ? ? ? ? ?| T必須繼承名為NameOfBaseClass的類(lèi)
where T : NameOfInterface ? ? ? ? ? ? | T必須實(shí)現(xiàn)名為NameOfInterface的接口
========

where(泛型類(lèi)型約束)

http://www.cnblogs.com/lystory/p/5104865.html
定義:在定義泛型的時(shí)候,我們可以使用 where 限制參數(shù)的范圍。


使用:在使用泛型的時(shí)候,你必須尊守 where 限制參數(shù)的范圍,否則編譯不會(huì)通過(guò)。


六種類(lèi)型的約束:


T:類(lèi)(類(lèi)型參數(shù)必須是引用類(lèi)型;這一點(diǎn)也適用于任何類(lèi)、接口、委托或數(shù)組類(lèi)型。)


? ? class MyClass<T, U>
? ? ? ? where T : class///約束T參數(shù)必須為“引用 類(lèi)型{ }”
? ? ? ? where U : struct///約束U參數(shù)必須為“值 類(lèi)型”
? ? { }
T:結(jié)構(gòu)(類(lèi)型參數(shù)必須是值類(lèi)型。可以指定除 Nullable 以外的任何值類(lèi)型。)


? ? class MyClass<T, U>
? ? ? ? where T : class///約束T參數(shù)必須為“引用 類(lèi)型{ }”
? ? ? ? where U : struct///約束U參數(shù)必須為“值 類(lèi)型”
? ? { }
T:new()(類(lèi)型參數(shù)必須具有無(wú)參數(shù)的公共構(gòu)造函數(shù)。當(dāng)與其他約束一起使用時(shí),new() 約束必須最后指定。)


class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
? ? // ...
}
T:<基類(lèi)名>(類(lèi)型參數(shù)必須是指定的基類(lèi)或派生自指定的基類(lèi)。)


public class Employee{}


public class GenericList<T> where T : Employee
T:<接口名稱(chēng)>(類(lèi)型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口。可以指定多個(gè)接口約束。約束接口也可以是泛型的。)


復(fù)制代碼
? ? /// <summary>
? ? /// 接口
? ? /// </summary>
? ? interface IMyInterface
? ? {
? ? }


? ? /// <summary>
? ? /// 定義的一個(gè)字典類(lèi)型
? ? /// </summary>
? ? /// <typeparam name="TKey"></typeparam>
? ? /// <typeparam name="TVal"></typeparam>
? ? class Dictionary<TKey, TVal>
? ? ? ? where TKey : IComparable, IEnumerable
? ? ? ? where TVal : IMyInterface
? ? {
? ? ? ? public void Add(TKey key, TVal val)
? ? ? ? {
? ? ? ? }
? ? }
復(fù)制代碼
T:U(為 T 提供的類(lèi)型參數(shù)必須是為 U 提供的參數(shù)或派生自為 U 提供的參數(shù)。也就是說(shuō)T和U的參數(shù)必須一樣)


class List<T>
{
? ? void Add<U>(List<U> items) where U : T {/*...*/}
}
?


一、可用于類(lèi):


public class MyGenericClass<T> where T:IComparable { }
二、可用于方法:


public bool MyMethod<T>(T t) where T : IMyInterface { }
三、可用于委托:


delegate T MyDelegate<T>() where T : new()
?


在實(shí)際項(xiàng)目中什么時(shí)候用到它們?


有時(shí)候你在做一個(gè)項(xiàng)目的時(shí)候,你需要用到泛型,你只希望傳給你的泛型參數(shù)是限定范圍的,


比如你希望值類(lèi)型,或者是引用類(lèi)型,或者是繼承至某個(gè)類(lèi)型、或者是符合某個(gè)接扣的類(lèi)型,


這個(gè)時(shí)候你該如何辦?你就需要用到 WHERE 來(lái)限定了。


?


參考文檔:


https://msdn.microsoft.com/zh-cn/library/d5x73970.aspx


https://msdn.microsoft.com/zh-cn/library/bb384067.aspx
========

c# 泛型類(lèi)型參數(shù)與約束的深入分析

http://www.jb51.net/article/37657.htm
本篇文章是對(duì)c#中泛型類(lèi)型參數(shù)與約束進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
..泛型類(lèi)型參數(shù)簡(jiǎn)介
在定義泛型類(lèi)型和泛型方法時(shí),常用到泛型類(lèi)型參數(shù),泛型類(lèi)型參數(shù)是在實(shí)例化泛型時(shí)指定類(lèi)型的占位符。泛型類(lèi)型參數(shù)放在“<>”內(nèi)。
泛型類(lèi)型參數(shù)命名建議:
(1)當(dāng)泛型類(lèi)型參數(shù)為單個(gè)字母時(shí),建議用T表示。
(2)當(dāng)泛型類(lèi)型參數(shù)用單詞定義時(shí),建議在單詞前加T。


復(fù)制代碼 代碼如下:
private void PromptName<T>(T t) {}
private void PromptName<Tuser>(Tuser user){}


泛型類(lèi)型參數(shù)約束
在定義泛型類(lèi)時(shí),可以對(duì)在實(shí)例化泛型類(lèi)時(shí)用于類(lèi)型參數(shù)的類(lèi)型種類(lèi)施加限制。如果實(shí)例化泛型類(lèi)時(shí)使用某個(gè)約束所不允許的類(lèi)型來(lái)實(shí)例化類(lèi),則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤。
泛型約束分類(lèi): ?


約束
?說(shuō)明
?
T:結(jié)構(gòu)
?類(lèi)型參數(shù)必須是值類(lèi)型。 可以指定除 Nullable 以外的任何值類(lèi)型。?
?
T:類(lèi)
?類(lèi)型參數(shù)必須是引用類(lèi)型;這一點(diǎn)也適用于任何類(lèi)、接口、委托或數(shù)組類(lèi)型。
?
T:new()
?類(lèi)型參數(shù)必須具有無(wú)參數(shù)的公共構(gòu)造函數(shù)。 當(dāng)與其他約束一起使用時(shí),new() 約束必須最后指定。
?
T:<基類(lèi)名>
?類(lèi)型參數(shù)必須是指定的基類(lèi)或派生自指定的基類(lèi)。
?
T:<接口名稱(chēng)>
?類(lèi)型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口。 可以指定多個(gè)接口約束。 約束接口也可以是泛型的。
?
T:U
?為 T 提供的類(lèi)型參數(shù)必須是為 U 提供的參數(shù)或派生自為 U 提供的參數(shù)。
?


(1)類(lèi)型參數(shù)約束為結(jié)構(gòu)(struct)。


復(fù)制代碼 代碼如下:
public class ShowObjectType<T> where T : struct
? ? {
? ? ? ? public void ShowValue<T>(T t)
? ? ? ? {
? ? ? ? ? ? Console.WriteLine(t.GetType());
? ? ? ? }
? ? }
? ? class GenericConstraint
? ? {
? ? ? ? static void Main()
? ? ? ? {


? ? ? ? ? ? ShowObjectType<int> showInt = new ShowObjectType<int>();
? ? ? ? ? ? showInt.ShowValue<int>(5);
? ? ? ? ? ? showInt.ShowValue(5);//從參數(shù)可以推導(dǎo)出類(lèi)型參數(shù)類(lèi)型,則可以省略類(lèi)型參數(shù)類(lèi)型


? ? ? ? ? ? //因?yàn)榧s束為值類(lèi)型,下面代碼不能通過(guò)編譯
? ? ? ? ? ? ShowObjectType<string> showString = new ShowObjectType<string>();
? ? ? ? ? ? showString.ShowValue("5");
? ? ? ? ? ? Console.Read();
? ? ? ? }
? ? }


(2)類(lèi)型參數(shù)約束為類(lèi)(class)。
在應(yīng)用 where T : class 約束時(shí),避免對(duì)類(lèi)型參數(shù)使用 == 和 != 運(yùn)算符,因?yàn)檫@些運(yùn)算符僅測(cè)試類(lèi)型為引用類(lèi)型,而不測(cè)試值相等性。


復(fù)制代碼 代碼如下:
class GenericConstraint
? ? {
? ? ? ? static void Main()
? ? ? ? {
? ? ? ? ? ? ? List<string > list = new List<string>();
? ? ? ? ? ? AddClass<string>(list, "hello generic");
? ? ? ? ? ? Console.Read();
? ? ? ? }
? ? ? ? private static void AddClass<T>(List<T> list, T t) where T : class
? ? ? ? {
? ? ? ? ? ? list.Add(t);
? ? ? ? }
? ? }


(3)類(lèi)型參數(shù)約束為具體類(lèi)。
約束為具體類(lèi)時(shí),可利用類(lèi)型參數(shù)調(diào)用具體類(lèi)的屬性和方法。


復(fù)制代碼 代碼如下:
class GenericConstraint
? ? {
? ? ? ? static void Main()
? ? ? ? {
? ? ? ? ? ? Person person = new Person { ID = 1, Name = "David" };
? ? ? ? ? ? PromptName<Person>(person);
? ? ? ? ? ? Console.Read();
? ? ? ? }
? ? ? ? //此約束T為Person對(duì)象或者繼承Person對(duì)象
? ? ? ? private static void PromptName<T>(T t) where T : Person?
? ? ? ? {
? ? ? ? ? ? //此處可使用Person的Name屬性
? ? ? ? ? ? if (t.Name == "David")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Console.WriteLine("Person name is David");
? ? ? ? ? ? }
? ? ? ? ? ? string name = t.GetName();
? ? ? ? ? ? Console.WriteLine("Person name is {0}", name);
? ? ? ? }
? ? }
? ? public class Person
? ? {
? ? ? ? private int id;
? ? ? ? public int ID
? ? ? ? {
? ? ? ? ? ? get { return id; }
? ? ? ? ? ? set { id = value; }
? ? ? ? }
? ? ? ? private string name;
? ? ? ? public string Name
? ? ? ? {
? ? ? ? ? ? get { return name; }
? ? ? ? ? ? set { name = value; }
? ? ? ? }
? ? ? ? public string GetName()
? ? ? ? {
? ? ? ? ? ? return Name;
? ? ? ? }
? ? }


(4)約束多個(gè)參數(shù)。


復(fù)制代碼 代碼如下:
class Base { }
class Test<T, U>
? ? where U : struct
? ? where T : Base, new() { }


(5)未綁定類(lèi)型參數(shù)。
?沒(méi)有約束的類(lèi)型參數(shù),稱(chēng)為未綁定的類(lèi)型參數(shù)。


復(fù)制代碼 代碼如下:
class ?List<T>{}


========

總結(jié)

以上是生活随笔為你收集整理的C# 泛型类型参数的约束的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。