日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
.Net泛型類(lèi)的學(xué)習(xí)總結(jié)

.Net泛型類(lèi)的學(xué)習(xí)首先我們來(lái)看看什么是.Net泛型類(lèi)?帶有“類(lèi)型參數(shù)”的類(lèi)稱(chēng)為“泛型類(lèi)”。那么如果使用.Net泛型類(lèi),則可為每個(gè)這樣的參數(shù)提供“類(lèi)型變量”,從而從.Net泛型類(lèi)生成一個(gè)“構(gòu)造類(lèi)”。之后可以聲明類(lèi)型為構(gòu)造類(lèi)的變量,創(chuàng)建構(gòu)造類(lèi)的實(shí)例,并將它分配給該變量。除類(lèi)以外,您還可以定義和使用泛型結(jié)構(gòu)、接口、過(guò)程和委托。下面我們就來(lái)看看.net泛型類(lèi)的一些聲明和以及.Net泛型類(lèi)創(chuàng)建的實(shí)例情況。

創(chuàng)新互聯(lián)公司是專(zhuān)業(yè)的網(wǎng)站建設(shè)公司,提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)站設(shè)計(jì)等網(wǎng)站開(kāi)發(fā)一體化解決方案;包括H5網(wǎng)站設(shè)計(jì),微信小程序,網(wǎng)站定制,企業(yè)網(wǎng)站建設(shè),電子商務(wù)商城網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),建網(wǎng)站,PHP網(wǎng)站建設(shè),軟件開(kāi)發(fā),軟文推廣,網(wǎng)站營(yíng)銷(xiāo)。歡迎做網(wǎng)站的企業(yè)前來(lái)合作洽談,創(chuàng)新互聯(lián)公司將竭誠(chéng)為您服務(wù)!

.Net泛型類(lèi)聲明

泛型類(lèi)聲明是一種類(lèi)的聲明,它需要提供類(lèi)型實(shí)參才能構(gòu)成實(shí)際類(lèi)型。

類(lèi)聲明可以有選擇地定義類(lèi)型形參:

 
 
 
  1. class-declaration:
  2. attributesopt  
  3.  class-modifiersopt  
  4.  class   identifier  
  5.  type-parameter-listopt  
  6.  class-baseopt
  7. type-parameter-constraints-clausesopt 
  8.   class-body   ;opt

只有提供了一個(gè) type-parameter-list,才可以為這個(gè)類(lèi)聲明提供 type-parameter-constraints-clauses。

提供了 type-parameter-list 的類(lèi)聲明是一個(gè)泛型類(lèi)聲明。此外,任何嵌套在泛型類(lèi)聲明或泛型結(jié)構(gòu)聲明中的類(lèi)本身就是一個(gè)泛型類(lèi)聲明,因?yàn)楸仨殲榘?lèi)型提供類(lèi)型形參才能創(chuàng)建構(gòu)造類(lèi)型。

除了明確指出的地方外,泛型類(lèi)聲明與非泛型類(lèi)聲明遵循相同的規(guī)則。泛型類(lèi)聲明可嵌套在非泛型類(lèi)聲明中。

使用構(gòu)造類(lèi)型 (constructed type)引用泛型類(lèi)。給定下面的泛型類(lèi)聲明

 
 
 
  1. class List﹤T﹥ {}

List﹤T﹥、List﹤int﹥ 和 List﹤List﹤string﹥﹥ 就是其構(gòu)造類(lèi)型的一些示例。使用一個(gè)或多個(gè)類(lèi)型形參的構(gòu)造類(lèi)型(例如 List﹤T﹥)稱(chēng)為開(kāi)放構(gòu)造類(lèi)型 (open constructed type)。不使用類(lèi)型形參的構(gòu)造類(lèi)型(例如 List﹤int﹥)稱(chēng)為封閉構(gòu)造類(lèi)型 (closed constructed type)。

泛型類(lèi)型可根據(jù)類(lèi)型形參的數(shù)目進(jìn)行“重載”;這就是說(shuō),同一命名空間或外層類(lèi)型聲明中的兩個(gè)類(lèi)型聲明可以使用相同標(biāo)識(shí)符,只要這兩個(gè)聲明具有不同數(shù)目的類(lèi)型形參即可。

 
 
 
  1. class C {}
  2. class C﹤V﹥ {}
  3. struct C﹤U,V﹥ {} // Error, C with two type parameters defined twice
  4. class C﹤A,B﹥ {}  // Error, C with two type parameters defined twice

類(lèi)型名稱(chēng)解析、簡(jiǎn)單名稱(chēng)解析和成員訪問(wèn)、過(guò)程中使用的類(lèi)型查找規(guī)則均會(huì)考慮類(lèi)型形參的數(shù)目。

泛型類(lèi)聲明的基接口必須滿(mǎn)足唯一性規(guī)則。

.Net泛型類(lèi)之類(lèi)型形參

類(lèi)型形參可在類(lèi)聲明中提供。每個(gè)類(lèi)型形參都是一個(gè)簡(jiǎn)單標(biāo)識(shí)符,代表一個(gè)為創(chuàng)建構(gòu)造類(lèi)型而提供的類(lèi)型實(shí)參的占位符。類(lèi)型形參是將來(lái)提供的類(lèi)型的形式占位符。而類(lèi)型實(shí)參是在創(chuàng)建構(gòu)造類(lèi)型時(shí)替換類(lèi)型形參的實(shí)際類(lèi)型。

 
 
 
  1. type-parameter-list:
  2. ﹤   type-parameters   ﹥
  3. type-parameters:
  4. attributesopt   type-parameter
  5. type-parameters   ,   attributesopt   type-parameter
  6. type-parameter:
  7. identifier

類(lèi)聲明中的每個(gè)類(lèi)型形參在該類(lèi)的聲明空間中定義一個(gè)名稱(chēng)。因此,它不能與另一個(gè)類(lèi)型形參或該類(lèi)中聲明的成員具有相同的名稱(chēng)。類(lèi)型形參不能與類(lèi)型本身具有相同的名稱(chēng)。

類(lèi)上的類(lèi)型形參的作用域包括 class-base、type-parameter-constraints-clauses 和 class-body。與類(lèi)的成員不同,此作用域不會(huì)擴(kuò)展到派生類(lèi)。在其作用域中,類(lèi)型形參可用作類(lèi)型。

 
 
 
  1. type:
  2. value-type
  3. reference-type
  4. type-parameter

由于類(lèi)型形參可使用許多不同的實(shí)際類(lèi)型實(shí)參進(jìn)行實(shí)例化,因此類(lèi)型形參具有與其他類(lèi)型稍微不同的操作和限制。這包括:

·不能直接使用類(lèi)型形參聲明基類(lèi)或接口

·類(lèi)型形參上的成員查找規(guī)則取決于應(yīng)用到該類(lèi)型形參的約束(如果有)。

·類(lèi)型形參的可用轉(zhuǎn)換取決于應(yīng)用到該類(lèi)型形參的約束(如果有)。

·如果事先不知道由類(lèi)型形參給出的類(lèi)型是引用類(lèi)型不能將標(biāo)識(shí)null 轉(zhuǎn)換為該類(lèi)型。不過(guò),可以改為使用默認(rèn)值表達(dá)式。此外,具有由類(lèi)型形參給出的類(lèi)型的值可以使用 == 和 != 與null 進(jìn)行比較,除非該類(lèi)型形參具有值類(lèi)型約束。

·僅當(dāng)類(lèi)型形參受 constructor-constraint 或值類(lèi)型約束的約束時(shí),才能將 new 表達(dá)式與類(lèi)型形參聯(lián)合使用。

·不能在屬性中的任何位置上使用類(lèi)型形參。

·不能在成員訪問(wèn)或類(lèi)型名稱(chēng)中使用類(lèi)型形參標(biāo)識(shí)靜態(tài)成員或嵌套類(lèi)型。

·在不安全代碼中,類(lèi)型形參不能用作 unmanaged-type。

作為類(lèi)型,類(lèi)型形參純粹是一個(gè)編譯時(shí)構(gòu)造。在運(yùn)行時(shí),每個(gè)類(lèi)型形參都綁定到一個(gè)運(yùn)行時(shí)類(lèi)型,運(yùn)行時(shí)類(lèi)型是通過(guò)向泛型類(lèi)型聲明提供類(lèi)型實(shí)參來(lái)指定的。因此,使用類(lèi)型形參聲明的變量的類(lèi)型在運(yùn)行時(shí)將是封閉構(gòu)造類(lèi)型。涉及類(lèi)型形參的所有語(yǔ)句和表達(dá)式的運(yùn)行時(shí)執(zhí)行都使用作為該形參的類(lèi)型實(shí)參提供的實(shí)際類(lèi)型。

.Net泛型類(lèi)之實(shí)例類(lèi)型

每個(gè)類(lèi)聲明都有一個(gè)關(guān)聯(lián)的構(gòu)造類(lèi)型,即實(shí)例類(lèi)型 (instance type)。對(duì)于泛型類(lèi)聲明,實(shí)例類(lèi)型是通過(guò)從該類(lèi)型聲明創(chuàng)建構(gòu)造類(lèi)型來(lái)構(gòu)成的,所提供的每個(gè)類(lèi)型實(shí)參替換對(duì)應(yīng)的類(lèi)型形參。由于實(shí)例類(lèi)型使用類(lèi)型形參,因此只能在類(lèi)型形參的作用域中使用該實(shí)例類(lèi)型;也就是在類(lèi)聲明的內(nèi)部。對(duì)于在類(lèi)聲明中編寫(xiě)的代碼,實(shí)例類(lèi)型為 this 的類(lèi)型。對(duì)于非泛型類(lèi),實(shí)例類(lèi)型就是所聲明的類(lèi)。下面顯示幾個(gè)類(lèi)聲明以及它們的實(shí)例類(lèi)型:

 
 
 
  1. class A﹤T﹥   // instance type: A﹤T﹥
  2. {
  3. class B {}    // instance type: A﹤T﹥.B
  4. class C﹤U﹥ {}// instance type: A﹤T﹥.C﹤U﹥
  5. }
  6. class D {}   // instance type: D

.Net泛型類(lèi)之基規(guī)范

類(lèi)聲明中指定的基類(lèi)可以是構(gòu)造類(lèi)類(lèi)型?;?lèi)本身不能是類(lèi)型形參,但在其作用域中可以包含類(lèi)型形參。

 
 
 
  1. class Extend﹤V﹥: V {}  
  2.  // Error, type parameter used as base class

泛型類(lèi)聲明不能使用 System.Attribute 作為直接或間接基類(lèi)。

類(lèi)聲明中指定的基接口可以是構(gòu)造接口類(lèi)型?;涌诒旧聿荒苁穷?lèi)型形參,但在其作用域中可以包含類(lèi)型形參。下面的代碼演示類(lèi)實(shí)現(xiàn)和擴(kuò)展構(gòu)造類(lèi)型的方法:

 
 
 
  1. class C﹤U,V﹥ {}
  2. interface I1﹤V﹥ {}
  3. class D: C﹤string,int﹥, I1﹤string﹥ {}
  4. class E﹤T﹥: C﹤int,T﹥, I1﹤T﹥ {}

泛型類(lèi)聲明的基接口必須滿(mǎn)足唯一性規(guī)則。

如果類(lèi)中的方法重寫(xiě)或?qū)崿F(xiàn)基類(lèi)或接口中的方法,則必須為特定類(lèi)型提供相應(yīng)的方法。下面的代碼演示如何重寫(xiě)和實(shí)現(xiàn)方法。對(duì)此做了進(jìn)一步的解釋。

 
 
 
  1. class C﹤U,V﹥ 
  2. {
  3. public virtual void M1(U x, List﹤V﹥ y) {}
  4. }
  5. interface I1﹤V﹥ 
  6. {
  7. V M2(V);
  8. }
  9. class D: C﹤string,int﹥, I1﹤string﹥ 
  10. {
  11. public override void M1(string x, List﹤int﹥ y) {}
  12. public string M2(string x) {}
  13. }

#p#

.Net泛型類(lèi)的成員

泛型類(lèi)的所有成員都可以直接或作為構(gòu)造類(lèi)型的一部分使用任何包容類(lèi) (enclosing class) 中的類(lèi)型形參。當(dāng)在運(yùn)行時(shí)使用特定的封閉構(gòu)造類(lèi)型時(shí),所出現(xiàn)的每個(gè)類(lèi)型形參都被替換成為該構(gòu)造類(lèi)型提供的實(shí)際類(lèi)型實(shí)參。例如:

 
 
 
  1. class C﹤V﹥
  2. {
  3. public V f1;
  4. public C﹤V﹥ f2 = null;
  5. public C(V x) {
  6. this.f1 = x;
  7. this.f2 = this;
  8. }
  9. }
  10. class Application
  11. {
  12. static void Main() {
  13. C﹤int﹥ x1 = new C﹤int﹥(1);
  14. Console.WriteLine(x1.f1);  // Prints 1
  15. C﹤double﹥ x2 = new C﹤double﹥(3.1415);
  16. Console.WriteLine(x2.f1);  // Prints 3.1415
  17. }
  18. }

在實(shí)例函數(shù)成員中,類(lèi)型 this 是包含這些成員的聲明的實(shí)例類(lèi)型。

除了使用類(lèi)型形參作為類(lèi)型以外,泛型類(lèi)聲明中的成員與非泛型類(lèi)的成員遵循相同的規(guī)則。下面幾小節(jié)將討論適用于特定種類(lèi)的成員的附加規(guī)則。

.Net泛型類(lèi)中的靜態(tài)字段

泛型類(lèi)聲明中的靜態(tài)變量在相同封閉構(gòu)造類(lèi)型的所有實(shí)例之間共享,但是不會(huì)在不同封閉構(gòu)造類(lèi)型的實(shí)例之間共享。不管靜態(tài)變量的類(lèi)型是否涉及任何類(lèi)型形參,這些規(guī)則都適用。

例如:

 
 
 
  1. class C﹤V﹥
  2. {
  3. static int count = 0;
  4. public C() {
  5. count++;
  6. }
  7. public static int Count {
  8. get { return count; }
  9. }
  10. }
  11. class Application
  12. {
  13. static void Main() {
  14. C﹤int﹥ x1 = new C﹤int﹥();
  15. Console.WriteLine(C﹤int﹥.Count);  // Prints 1
  16. C﹤double﹥ x2 = new C﹤double﹥();
  17. Console.WriteLine(C﹤int﹥.Count);  // Prints 1
  18. C﹤int﹥ x3 = new C﹤int﹥();
  19. Console.WriteLine(C﹤int﹥.Count);  // Prints 2
  20. }
  21. }

.Net泛型類(lèi)中的靜態(tài)構(gòu)造函數(shù)

泛型類(lèi)中的靜態(tài)構(gòu)造函數(shù)用于初始化靜態(tài)字段,并為從該泛型類(lèi)聲明創(chuàng)建的每個(gè)不同封閉構(gòu)造類(lèi)型執(zhí)行其他初始化操作。泛型類(lèi)型聲明的類(lèi)型形參處于作用域中,并且可在靜態(tài)構(gòu)造函數(shù)的函數(shù)體中使用。

新的封閉構(gòu)造類(lèi)類(lèi)型在***次發(fā)生下列任一情況時(shí)進(jìn)行初始化:

·創(chuàng)建該封閉構(gòu)造類(lèi)型的實(shí)例。

·引用該封閉構(gòu)造類(lèi)型的任何靜態(tài)成員。

為了初始化新的封閉構(gòu)造類(lèi)類(lèi)型,需要先為該特定的封閉構(gòu)造類(lèi)型創(chuàng)建一組新的靜態(tài)字段。將其中的每個(gè)靜態(tài)字段初始化為默認(rèn)值。下一步,為這些靜態(tài)字段執(zhí)行靜態(tài)字段初始值設(shè)定項(xiàng)。***,執(zhí)行靜態(tài)構(gòu)造函數(shù)。

由于靜態(tài)構(gòu)造函數(shù)只為每個(gè)封閉構(gòu)造類(lèi)類(lèi)型執(zhí)行一次,因此對(duì)于無(wú)法通過(guò)約束在編譯時(shí)進(jìn)行檢查的類(lèi)型形參來(lái)說(shuō),此處是進(jìn)行運(yùn)行時(shí)檢查的方便位置。例如,下面的類(lèi)型使用靜態(tài)構(gòu)造函數(shù)檢查類(lèi)型實(shí)參是否為一個(gè)枚舉:

 
 
 
  1. class Gen﹤T﹥ where T: struct
  2. {
  3. static Gen() {
  4. if (!typeof(T).IsEnum) {
  5.    throw new ArgumentException("T must be an enum");
  6. }
  7. }
  8. }

.Net泛型類(lèi)之訪問(wèn)受保護(hù)成員

在泛型類(lèi)聲明中,通過(guò)從該泛型類(lèi)構(gòu)造的任何類(lèi)類(lèi)型的實(shí)例,可以對(duì)繼承的受保護(hù)實(shí)例成員進(jìn)行訪問(wèn)。具體而言,指定的用于訪問(wèn) protected 和 protected internal 實(shí)例成員的規(guī)則通過(guò)下面針對(duì)泛型的規(guī)則進(jìn)行了擴(kuò)充:

在泛型類(lèi) G 中,如果 E 的類(lèi)型是從 G 構(gòu)造的類(lèi)類(lèi)型或從 G 構(gòu)造的類(lèi)類(lèi)型繼承的類(lèi)類(lèi)型,則使用 E.M 形式的 primary-expression 訪問(wèn)繼承的受保護(hù)實(shí)例成員 M 是允許的。

在下面的示例中

 
 
 
  1. class C﹤T﹥
  2. {
  3. protected T x;
  4. }
  5. class D﹤T﹥: C﹤T﹥
  6. {
  7. static void F() {
  8. D﹤T﹥ dt = new D﹤T﹥();
  9. D﹤int﹥ di = new D﹤int﹥();
  10. D﹤string﹥ ds = new D﹤string﹥();
  11. dt.x = default(T);
  12. di.x = 123;
  13. ds.x = "test";
  14. }
  15. }

對(duì) x 的三個(gè)賦值是允許的,因?yàn)樗鼈內(nèi)纪ㄟ^(guò)從該泛型類(lèi)型構(gòu)造的類(lèi)類(lèi)型的實(shí)例進(jìn)行。

.Net泛型類(lèi)中的重載

泛型類(lèi)聲明中的方法、構(gòu)造函數(shù)、索引器和運(yùn)算符可以被重載。雖然聲明的簽名必須唯一,但是在替換類(lèi)型實(shí)參時(shí)可能會(huì)導(dǎo)致出現(xiàn)完全相同的簽名。在這樣的情況下,重載解析的附加規(guī)則將挑選最明確的
成員。

下面的示例根據(jù)此規(guī)則演示有效和無(wú)效的重載:

 
 
 
  1. interface I1﹤T﹥ {}
  2. interface I2﹤T﹥ {}
  3. class G1﹤U﹥
  4. {
  5. int F1(U u); // Overload resulotion for G﹤int﹥.F1
  6. int F1(int i);   // will pick non-generic
  7. void F2(I1﹤U﹥ a); // Valid overload
  8. void F2(I2﹤U﹥ a);
  9. }
  10. class G2﹤U,V﹥
  11. {
  12. void F3(U u, V v);// Valid, but overload resolution for
  13. void F3(V v, U u);// G2﹤int,int﹥.F3 will fail
  14. void F4(U u, I1﹤V﹥ v); // Valid, but overload resolution for  
  15.    void F4(I1﹤V﹥ v, U u);// G2﹤I1﹤int﹥,int﹥.F4 will fail
  16. void F5(U u1, I1﹤V﹥ v2); // Valid overload
  17. void F5(V v1, U u2);
  18. void F6(ref U u); // valid overload
  19. void F6(out V v);
  20. }

形參數(shù)組方法和類(lèi)型形參

可以在形參數(shù)組的類(lèi)型中使用類(lèi)型形參。例如,給定下面的聲明

 
 
 
  1. class C﹤V﹥
  2. {
  3. static void F(int x, int y, params V[] args);
  4. }

對(duì)該方法的如下展開(kāi)形式的調(diào)用:

 
 
 
  1. C﹤int﹥.F(10, 20);
  2. C﹤object﹥.F(10, 20, 30, 40);
  3. C﹤string﹥.F(10, 20, "hello", "goodbye");

完全對(duì)應(yīng)于:

 
 
 
  1. C﹤int﹥.F(10, 20, new int[] {});
  2. C﹤object﹥.F(10, 20, new object[] {30, 40});
  3. C﹤string﹥.F(10, 20, new string[] {"hello", "goodbye"} );

.Net泛型類(lèi)之重寫(xiě)和泛型類(lèi)

和往常一樣,泛型類(lèi)中的函數(shù)成員可以重寫(xiě)基類(lèi)中的函數(shù)成員。在確定被重寫(xiě)的基成員時(shí),必須通過(guò)替換類(lèi)型實(shí)參來(lái)確定基類(lèi)的成員。一旦確定了基類(lèi)的成員,重寫(xiě)規(guī)則就與非泛型類(lèi)
相同。

下面的示例演示重寫(xiě)規(guī)則如何在存在泛型的情況下起作用:

 
 
 
  1. abstract class C﹤T﹥
  2. {
  3. public virtual T F() {}
  4. public virtual C﹤T﹥ G() {}
  5. public virtual void H(C﹤T﹥ x) {}
  6. }
  7. class D: C﹤string﹥
  8. {
  9. public override string F() {}    // Ok
  10. public override C﹤string﹥ G() {} // Ok
  11. public override void H(C﹤T﹥ x) {} // Error, should be C﹤string﹥
  12. }
  13. class E﹤T,U﹥: C﹤U﹥
  14. {
  15. public override U F() {}// Ok
  16. public override C﹤U﹥ G() {}  // Ok
  17. public override void H(C﹤T﹥ x) {} // Error, should be C﹤U﹥
  18. }

.Net泛型類(lèi)中的運(yùn)算符

泛型類(lèi)聲明可以定義運(yùn)算符,所遵循的規(guī)則與非泛型類(lèi)聲明相同。運(yùn)算符聲明中使用類(lèi)聲明的實(shí)例類(lèi)型的方式必須與運(yùn)算符的正常使用規(guī)則類(lèi)似,具體如下:

·一元運(yùn)算符必須以該實(shí)例類(lèi)型的單個(gè)參數(shù)為操作對(duì)象。一元的 ++ 和 -- 運(yùn)算符必須返回該實(shí)例類(lèi)型或從該實(shí)例類(lèi)型派生的類(lèi)型。

·二元運(yùn)算符的參數(shù)中必須至少有一個(gè)屬于該實(shí)例類(lèi)型。

·轉(zhuǎn)換運(yùn)算符的形參類(lèi)型或返回類(lèi)型必須屬于該實(shí)例類(lèi)型。

下面演示泛型類(lèi)中的有效運(yùn)算符聲明的一些示例:

 
 
 
  1. class X﹤T﹥
  2. {
  3. public static X﹤T﹥ operator ++(X﹤T﹥ operand) {}
  4. public static int operator *(X﹤T﹥ op1, int op2) {}
  5. public static explicit operator X﹤T﹥(T value) {}
  6. }

對(duì)于從源類(lèi)型 S 轉(zhuǎn)換到目標(biāo)類(lèi)型 T 的轉(zhuǎn)換運(yùn)算符,在應(yīng)用指定的規(guī)則時(shí),與 S 或 T 關(guān)聯(lián)的任何類(lèi)型形參都被視為與其他類(lèi)型沒(méi)有繼承關(guān)系的唯一類(lèi)型,并忽略對(duì)那些類(lèi)型形參的所有約束。

在下面的示例中

 
 
 
  1. class C﹤T﹥ {}
  2. class D﹤T﹥: C﹤T﹥
  3. {
  4. public static implicit operator C﹤int﹥(D﹤T﹥ value) {}  // Ok
  5. public static implicit operator C﹤string﹥(D﹤T﹥ value) {} // Ok
  6. public static implicit operator C﹤T﹥(D﹤T﹥ value) {} // Error
  7. }

前兩個(gè)運(yùn)算符聲明是允許的,T 和 int 以及 string 分別被視為沒(méi)有關(guān)系的唯一類(lèi)型。但是,第三個(gè)運(yùn)算符是錯(cuò)誤的,因?yàn)?C﹤T﹥ 是 D﹤T﹥ 的基類(lèi)。

對(duì)于某些類(lèi)型實(shí)參,可以聲明這樣的運(yùn)算符,即這些運(yùn)算符指定了已經(jīng)作為預(yù)定義轉(zhuǎn)換而存在的轉(zhuǎn)換。在下面的示例中

 
 
 
  1. struct Convertible﹤T﹥
  2. {
  3. public static implicit operator Convertible﹤T﹥(T value) {}
  4. public static explicit operator T(Convertible﹤T﹥ value) {}
  5. }

當(dāng)把類(lèi)型 object 指定為 T 的類(lèi)型實(shí)參時(shí),第二個(gè)運(yùn)算符將聲明一個(gè)已經(jīng)存在的轉(zhuǎn)換(存在從任何類(lèi)型到類(lèi)型 object 的隱式轉(zhuǎn)換,因此也存在顯式轉(zhuǎn)換)。

在兩個(gè)類(lèi)型之間存在預(yù)定義轉(zhuǎn)換的情況下,這些類(lèi)型之間的任何用戶(hù)定義的轉(zhuǎn)換將被忽略。具體而言:

·如果存在從類(lèi)型 S 到類(lèi)型T 的預(yù)定義隱式轉(zhuǎn)換,則從S 到T 的所有用戶(hù)定義的轉(zhuǎn)換(隱式或顯式)將被忽略。

·如果存在從類(lèi)型S 到類(lèi)型T 的預(yù)定義顯式轉(zhuǎn)換,則從 S 到T 的所有用戶(hù)定義的顯式轉(zhuǎn)換將被忽略。但是,仍然會(huì)考慮從 S 到 T 的用戶(hù)定義的隱式轉(zhuǎn)換。

對(duì)于除 object 以外的所有類(lèi)型,上面的 Convertible﹤T﹥ 類(lèi)型聲明的運(yùn)算符都不會(huì)與預(yù)定義的轉(zhuǎn)換發(fā)生沖突。例如:

 
 
 
  1. void F(int i, Convertible﹤int﹥ n) {
  2. i = n; // Error
  3. i = (int)n;    // User-defined explicit conversion
  4. n = i; // User-defined implicit conversion
  5. n = (Convertible﹤int﹥)i;    // User-defined implicit conversion
  6. }

但是對(duì)于類(lèi)型 object,除了下面這個(gè)特例之外,預(yù)定義的轉(zhuǎn)換將在其他所有情況下隱藏用戶(hù)定義的
轉(zhuǎn)換:

 
 
 
  1. void F(object o, Convertible﹤object﹥ n) {
  2. o = n; // Pre-defined boxing conversion
  3. o = (object)n; // Pre-defined boxing conversion
  4. n = o; // User-defined implicit conversion
  5. n = (Convertible﹤object﹥)o; // Pre-defined unboxing conversion
  6. }

.Net泛型類(lèi)中的嵌套類(lèi)型

泛型類(lèi)聲明可以包含嵌套的類(lèi)型聲明。包容類(lèi)的類(lèi)型形參可以在嵌套類(lèi)型中使用。嵌套類(lèi)型聲明可以包含僅適用于該嵌套類(lèi)型的附加類(lèi)型形參。

泛型類(lèi)聲明中包含的每個(gè)類(lèi)型聲明都隱式地是泛型類(lèi)型聲明。在編寫(xiě)對(duì)嵌套在泛型類(lèi)型中的類(lèi)型的引用時(shí),必須指定其包容構(gòu)造類(lèi)型(包括其類(lèi)型實(shí)參)。但是可在外層類(lèi)中不加限定地使用嵌套類(lèi)型;在構(gòu)造嵌套類(lèi)型時(shí)可以隱式地使用外層類(lèi)的實(shí)例類(lèi)型。下面的示例演示三種不同的引用從 Inner 創(chuàng)建的構(gòu)造類(lèi)型的正確方法;前兩種方法是等效的:

 
 
 
  1. class Outer﹤T﹥
  2. {
  3.    class Inner﹤U﹥
  4. {
  5. public static void F(T t, U u) {}
  6. }
  7. static void F(T t) {
  8. Outer﹤T﹥.Inner﹤string﹥.F(t, "abc");  // These two statements have
  9. Inner﹤string﹥.F(t, "abc"); // the same effect
  10. Outer﹤int﹥.Inner﹤string﹥.F(3, "abc");  // This type is different
  11. Outer.Inner﹤string﹥.F(t, "abc");// Error, Outer needs type arg
  12. }
  13. }

嵌套類(lèi)型中的類(lèi)型形參可以隱藏外層類(lèi)型中聲明的成員或類(lèi)型形參,但這是一種不好的編程風(fēng)格:

 
 
 
  1. class Outer﹤T﹥
  2. {
  3. class Inner﹤T﹥  // Valid, hides Outer’s T
  4. {
  5. public T t;  // Refers to Inner’s T
  6. }
  7. }

.Net泛型類(lèi)的聲明以及使用中會(huì)碰到的一些概念及應(yīng)用的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí).Net泛型類(lèi)有所幫助。


文章名稱(chēng):.Net泛型類(lèi)的學(xué)習(xí)總結(jié)
文章分享:http://m.5511xx.com/article/djcoggo.html