精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C# 4.0中泛型協(xié)變性和逆變性詳解

開發(fā) 后端
C# 4.0一直被人們鎖關注,它增加了很多新的功能和特性,本文將向您介紹C# 4.0泛型協(xié)變性和逆變性的相關知識。

VS2010的推出會為我們帶來新版本的C#。了解C#4.0中的新功能有助于我們利用編碼。它還能夠幫助我們了解程序中正在出現(xiàn),而下一代的C#有可能會解決的錯誤。最終,這樣的實踐可以幫助我們在現(xiàn)有的知識結構上創(chuàng)建適應C#4.0的業(yè)務。

在本文中我們關注的是C# 4.0中的協(xié)變性和逆變性。

恒定性,協(xié)變性和逆變性

在進一步研究問題之前,我們先解釋一下恒定性,協(xié)變性,逆變性參數以及返回類型這些概念的意思。大家對這些概念應該是熟悉的,即便那你可能并不能把握這些概念的正式定義。

如果你必須使用完全匹配正式類型的名稱,那么返回的值或參數是不變的。如果你能夠使用更多的衍生類型作為正式參數類型的代替物,那么參數是可變的。如果你能夠將返回的類型分配給擁有較少類型的變量,那么返回的值是逆變的。

在大多數情況下,C#支持協(xié)變參數和逆變的返回類型。這一特性也符合其他所有的對象指向型語言。事實上,多態(tài)性通常是建立在協(xié)變和逆變的概念之上的。直觀上,我們發(fā)現(xiàn)是可以將衍生的類對象發(fā)送給任何期望基類對象的方法。比較,衍生的對象也是基類對象的實例。本能地我們也清楚,我們可以將方法的結果保存在擁有較少衍生對象類型的變量中。例如,你可能會需要對這段代碼進行編譯:

public static void PrintOutput(object thing) 
  {

  if (thing != null)

  Console.WriteLine(thing);

  }

  // elsewhere:

  PrintOutput(5);

  PrintOutput("This is a string");

這段代碼之所以有效是因為參數類型在C#中具有協(xié)變性,你可以將任意方法保存在類型對象的變量中,因為C#中返回類型是逆變的:

 object value = SomeMethod();

如果在.NET推出后,你已經了解C#或VB.NET,那么你應該很熟悉以上的內容。但是規(guī)則發(fā)生了一些改變。在很多方法中,你直覺上認為有效的其實不然。隨著你漸漸深入了解,會發(fā)現(xiàn)你曾經認為是漏洞的東西很可能是該語言的說明。現(xiàn)在是時候解釋一下為什么集合以不同的方式工作,以及未來將發(fā)生些什么變化。

基于對象的集合

.NET 1.x集合(ArrayList,HashTable,Queue等)可以被視為具有協(xié)變性。遺憾的是,它們不具有安全的協(xié)變性。事實上,它們具有恒定性。不過由于它們向System.Object保存了參考,它們看上去像是具有了協(xié)變性和逆變性。舉幾個例子就可以說明這個問題。

你可以認為這些集合是協(xié)變的,因為你可以創(chuàng)建一個員工對象的數組列表,然后使用這個列表作為任意方法的參數,這些方法使用的是類型數組列表的對象。通常這種方法很有效。這個方法可能能夠與數組列表連用:

private void SafeCovariance(ArrayList bunchOfItems) 
  {

  foreach(object o in bunchOfItems)

  Console.WriteLine(o);

  // reverse the items:

  int start = 0;

  int end = bunchOfItems.Count - 1;

  while (start < end)

  {

  object tmp = bunchOfItems[start];

  bunchOfItems[start] = bunchOfItems[end];

  bunchOfItems[end] = tmp;

  start++;

  end--;

  }

  foreach(object o in bunchOfItems)

  Console.WriteLine(o);

  }

這個方法是安全的因為它沒有改變集合中任何對象的類型。它列舉了集合并將集合中已有的項目移動到了不同索引。不過并未改變任何類型,因此這個方法適用于所有實例。但是數組列表和其他傳統(tǒng)的.NET 1.x集合不會被視為安全的協(xié)變。看這一方法:

private void UnsafeUse(ArrayList stuff) 
  {

  for (int index = 0; index < stuff.Count; index++)

  stuff[index] = stuff[index].ToString();

  }

這是對保存在集合中的作出的更深一層的假設。當方法存在時候,集合包含了類型字符串的對象。或許這不再是原始集合中的類型。事實上,如果原始集合包含這些字符串,那么方法就不會產生效果。否則,它會將集合轉換為不同的類型。下列使用實例顯示了在調用方法的時候遇到的各種問題。此處,一列數字被發(fā)送到了UnsafeUse,而數字正是在此處被轉換成了字符串的數組列表。調用以后,呼叫代碼會嘗試再一次創(chuàng)建能夠導致InvalidCastException的項目。

 // usage: 
  public void DoTest()

  {

  ArrayList collection = new ArrayList()

  {

  1,2,3,4,5,6,7, 8, 9, 10,

  11,12,13,14,15,16,17,18,19,20,

  21,22,23,24,25,26,27,28,29,30

  };

  SafeCovariance(collection);

  // create the sum:

  int sum = 0;

  foreach (int num in collection)

  sum += num;

  Console.WriteLine(sum);

  UnsafeUse(collection);

  // create the sum:

  sum = 0;

  try

  {

  foreach (int num in collection)

  sum += num;

  Console.WriteLine(sum);

  }

  catch (InvalidCastException)

  {

  Console.WriteLine(

  "Not safely covariant");

  }

  }

 

這個例子表明雖然典型的集合是不變的,但是你可以視它們?yōu)榭勺兓蚩赡孀儭2贿^這些集合并非安全可變。編譯器難保不會出現(xiàn)失誤。#p#

數組

作為參數使用的時候,數組時而可變時而不可變。和典型集合一樣,數組具有非安全的協(xié)變性。首先,只有包含了參考類型的數組可以被視為具有協(xié)變性或逆變性。值類型的數組通常不可變,即便是調用一個期望對象數組的方法時也是如此。這一方法可以與其他任何參考類型的數組一起調用,但是你不能向其發(fā)送整數數組或其他數值類型:

  private void PrintCollection(object[] collection) 
  {

  foreach (object o in collection)

  Console.WriteLine(o);

  }

只要你限制引用類型,數組就會具有協(xié)變性和逆變性。但是仍然是不安全的。你將數組視為可變或逆變的次數越多,越會發(fā)現(xiàn)你需要處理ArrayTypeMismatchException。讓我們檢查其中的一些方法。數組參數是可變的,但卻是非安全協(xié)變。檢查下列不安全的方法:

  private class B 
  {

  public override string ToString()

  {

  return "This is a B";

  }

  }

  private class D : B

  {

  public override string ToString()

  {

  return "This is a D";

  }

  }

  private class D2 : B

  {

  public override string ToString()

  {

  return "This is a D2";

  }

  }

  private void DestroyCollection(B[] storage)

  {

  try

  {

  for (int index = 0; index < storage.Length; index++)

  storage[index] = new D2();

  }

  catch (ArrayTypeMismatchException)

  {

  Console.WriteLine("ArrayTypeMismatch");

  }

  }

下面的調用順序會引發(fā)循環(huán)以拋出一個ArrayTypeMismatch例外:

D[] array = new D[]{ 
  new D(),

  new D(),

  new D(),

  new D(),

  new D(),

  new D(),

  new D(),

  new D(),

  new D(),

  new D()};

  DestroyCollection(array);

當我們將兩個板塊集合起來看時就一目了然了。調用頁面創(chuàng)建了一個D 對象數組,然后調用了期望B對象數組的方法。因為數組是可變的,你可以將D[]發(fā)送到期望B[]的方法。但是在DestroyCollection()里面,可以修改數組。在本例中,它創(chuàng)建了用于集合的新對象,類型D2的對象。這在該方法中是允許的:D2對象可以保存在B[]中因為D2是由B衍生出來的。但是其結合往往會引發(fā)錯誤。當你引入一些返回數組儲存的方法并視其為逆變值時,同樣的事情也會發(fā)生。向這樣的代碼才能有效:

B[] storage = GenerateCollection(); 
  storage[0] = new B();

但是,如果GenerateCollection的內容向這樣的話,那么當storage[0]要素被設置到B對象中,它會引發(fā)ArrayTypeMismatch異常。#p#

泛型集合

數組被當作是可變和可逆變,即便是不安全的。.NET1.x集合類型是不可變的,但是將參考保存到了Systems.Object。.NET2.x中的泛型集合并且被視為不可變。這意味著你不能夠替代包含有較多衍生對象的集合。最好你試一試下面的代碼:

private void WriteItems(IEnumerable< object> sequence) 
  {

  foreach (var item in sequence)

  Console.WriteLine(item);

  }

你要知道自己可能會和其他執(zhí)行IEnumberable< T>集合一起對其進行調用因為任何T必須由對象衍生。這或許是你的期望,但是由于泛型是不變的,下面的操作將無法進行編譯:

IEnumerable< int> items = Enumerable.Range(1, 50);

WriteItems(items); // generates CS1502, CS1503

你也不能將泛型集合類型視為可逆變。這行代碼之所以不能進行編譯是因為分配返回數值的時候,你不能將IEnumberable< T>轉換成IEnumberable< object>:

IEnumerable< object> moreItems =

Enumerable.Range(1, 50);

你或許認為IEnumberable< int>衍生自IEnumberable< object>,但是事實不然。IEnumberable< int>是一個基于IEnumberable< T>泛型類定義的閉合泛型類。它們不會相互衍生,因此沒有關聯(lián)性,而且你也不能視其具有可變性。即便在兩個類型參數之間具備關聯(lián)性,使用類型參數的泛型類型不會對這種關聯(lián)有響應。

C#以不變的方式對待泛型顯示出了該語言的強大優(yōu)勢。最重要的是,你不能在數組和1.x集合中出錯。一旦你編譯了泛型代碼,你就能夠很好地利用這些代碼了。這與C#的傳統(tǒng)具有一致性,因為它利用了編譯器來刪除代碼中可能存在的漏洞。

但是對于對于強效輸入的依賴性顯示出了一定的局限性。上文顯示的關于泛型轉換的構造看上去是有效的。但是你不會想將其轉換為.NET1.x集合和數組中使用的行為。我們真正想要的是僅在它運行的時候將泛型類型視作是可變的或可逆變的,而不是用運行時錯誤代替編譯時錯誤的時候。

您正在閱讀:C# 4.0中泛型協(xié)變性和逆變性詳解

 

【編輯推薦】

  1. 淺談C# 4.0中的動態(tài)類型和動態(tài)編程
  2. C# 4.0新功能和展望
  3. 詳解C# 4.0中必選參數與可選參數混合的問題
  4. C# 4.0新特性dynamic作用淺析
  5. C# 4.0 的4個新特性
責任編輯:佚名 來源: IT專家網
相關推薦

2009-08-03 18:24:28

C# 4.0協(xié)變和逆變

2011-01-14 10:27:18

C#.netasp.net

2024-12-23 10:20:50

2009-08-24 18:22:05

C# 泛型編程

2009-12-24 09:16:11

C#泛型

2009-08-26 18:02:05

C#泛型問題

2009-08-24 16:39:19

C# 泛型應用

2009-08-24 13:52:04

C# 泛型約束

2009-05-27 11:30:20

C#Visual Stud協(xié)變

2009-08-26 09:36:03

C#泛型

2009-10-20 15:03:29

ExpandoObje

2009-09-02 17:38:16

C#泛型支持

2009-08-24 15:12:13

C# 泛型接口

2009-08-24 18:15:24

C# Dictiona

2009-08-24 14:43:35

C# 泛型

2009-08-24 14:51:25

C# 泛型泛型類型

2009-06-24 10:25:25

C#泛型

2009-08-24 15:38:21

C# 泛型數組

2025-07-29 06:00:00

final關鍵字開發(fā)

2009-08-24 16:01:44

C# 泛型
點贊
收藏

51CTO技術棧公眾號

91美女福利视频| 四虎5151久久欧美毛片| 国产精品久久久久久久久免费桃花 | 少妇又色又爽又黄的视频| 亚洲成色精品| 一区二区在线视频播放| 国产福利一区视频| 日本视频在线| 国产精品一区在线| 欧日韩不卡在线视频| 99久久久免费精品| 偷拍一区二区| 日韩一区二区三区在线观看| 看av免费毛片手机播放| 国产成人l区| 久久女同性恋中文字幕| 91在线观看免费高清完整版在线观看| 精品深夜av无码一区二区老年| 中文字幕精品影院| 精品美女在线观看| 日韩精品视频一二三| a毛片在线观看| 日本在线一级片| 欧美人体一区二区三区| 亚洲欧美另类久久久精品| 免费久久久一本精品久久区| a天堂中文在线观看| 石原莉奈在线亚洲三区| 欧美激情一级欧美精品| 日韩av不卡在线播放| 国产情侣av在线| 日韩在线一区二区三区| 高清欧美一区二区三区| 国产精品免费在线视频| 国产探花在线精品一区二区| 亚洲444eee在线观看| 少妇特黄a一区二区三区| 亚洲春色一区二区三区| 激情综合亚洲精品| 色诱女教师一区二区三区| 成人免费看aa片| 国内精品免费| 日韩美女一区二区三区| 午夜不卡福利视频| 激情小说亚洲| 欧美日韩一区高清| 亚洲少妇第一页| 新片速递亚洲合集欧美合集| 欧美丝袜第一区| av网站在线观看不卡| 2001个疯子在线观看| 亚洲一区二区欧美| 欧美一区二区激情| 丰乳肥臀在线| 亚洲午夜久久久久久久久久久 | 国产精品成人av| 在线观看欧美日韩| 阿v天堂2014| 大色综合视频网站在线播放| 一区二区三区久久精品| 欧美丰满老妇熟乱xxxxyyy| 欧美精品一区二区三区精品| 在线性视频日韩欧美| 成人在线观看免费高清| 区一区二视频| 精品国内亚洲在观看18黄| 久久精品在线观看视频| 一区二区三区网站| 欧美大片在线看| 日韩黄色在线视频| 免费日韩视频| 国产美女精品视频| a毛片在线免费观看| 国产成人精品网址| 热99在线视频| 天天射天天干天天| 奇米影视一区二区三区| 成人在线激情视频| 亚洲高清视频在线播放| 91在线云播放| 四虎影院一区二区三区 | 日韩精品麻豆| 青草国产精品久久久久久| 国产精品久久中文| av中文字幕播放| av成人老司机| 色一情一乱一伦一区二区三区丨| 巨大荫蒂视频欧美另类大| 亚洲一二三四在线| 日本熟妇人妻xxxxx| 日韩久久一区| 亚洲黄在线观看| 成熟人妻av无码专区| 欧美福利在线| 日本免费一区二区三区视频观看 | 久久男女视频| 91久久久久久| 深夜福利视频在线免费观看| 国产精品福利一区| 9久久9毛片又大又硬又粗| 成人看片网页| 精品粉嫩超白一线天av| 国产伦精品一区二区三区视频女| 一本一道久久综合狠狠老| 91sa在线看| 国产精品久久久久久69| 91小视频免费看| 少妇熟女一区二区| 蜜臀国产一区| 精品国产3级a| 一区二区三区影视| 久久久久一区| 国产精品69毛片高清亚洲| 日本精品视频在线播放| 精品人妻一区二区三区麻豆91| 久久亚洲二区三区| 成人在线观看毛片| 国产激情欧美| 亚洲欧美日本另类| 国产在线视频第一页| 日本在线电影一区二区三区| 久久久久久久久久婷婷| 亚洲网站在线免费观看| 26uuu欧美| 免费看毛片的网址| 精品一区视频| 爽爽爽爽爽爽爽成人免费观看| 午夜毛片在线观看| 国产99精品国产| 中文字幕中文字幕在线中一区高清| 日韩av影片| 亚洲精品一区二区三区四区高清| 久久久久久久久久97| 日本vs亚洲vs韩国一区三区二区 | 男人天堂综合网| 亚洲图片你懂的| 欧美wwwwwww| 成人在线免费观看91| 青青草国产精品一区二区| 秋霞av鲁丝片一区二区| 亚洲伊人伊色伊影伊综合网 | 成人av资源网站| 最新视频 - x88av| 91精品福利观看| 日韩中文av在线| 亚洲精品一区二区二区| 国产亚洲自拍一区| 国产性生交xxxxx免费| 蜜桃一区二区三区| 日本中文字幕久久看| 青青草视频在线免费观看| 天天色综合天天| 热舞福利精品大尺度视频| www.美色吧.com| 日韩在线综合| 国产一区红桃视频| 理论片午午伦夜理片在线播放| 欧美日韩一区国产| 91香蕉一区二区三区在线观看| 韩日欧美一区二区三区| 一级黄色片播放| 999在线精品| 2018日韩中文字幕| 欧美zozo| 欧美三片在线视频观看| 欧美肥妇bbwbbw| 国产激情一区二区三区| 97超碰在线人人| 日韩精品欧美大片| 国产福利精品在线| 免费大片黄在线观看视频网站| 91精品黄色片免费大全| 久久久久97国产| 91丨porny丨在线| 久久精品影视大全| 香蕉视频官网在线观看日本一区二区| 91香蕉亚洲精品| 成人bbav| 中文字幕日韩高清| 性做久久久久久久久久| 狠狠久久亚洲欧美专区| 人人爽人人爽人人片| 国产一区在线看| 日韩伦理在线免费观看| 狠狠做六月爱婷婷综合aⅴ| 成人黄色av播放免费| 国产高清在线a视频大全| 日韩国产高清视频在线| 7777久久亚洲中文字幕| 亚洲国产中文字幕| 精品人妻互换一区二区三区| 国产一区二区三区不卡在线观看 | 蜜乳av一区| 亚洲天堂av电影| 国产sm主人调教女m视频| 欧美日韩色婷婷| 天天做夜夜爱爱爱| 91麻豆国产在线观看| www,av在线| 久久xxxx精品视频| 91精品国产毛片武则天| 激情五月综合| 国产精品国产精品| 欧美极品在线| 日本韩国欧美精品大片卡二| av在线网址观看| 国产亚洲xxx| 农村少妇久久久久久久| 欧美日本乱大交xxxxx| 国产精品视频久久久久久久| 亚洲免费av高清| 人人妻人人澡人人爽| 成人app下载| www.五月天色| 另类专区欧美蜜桃臀第一页| 日本韩国欧美在线观看| 亚洲欧美一级二级三级| 先锋影音亚洲资源| 国产一级二级三级| 久久亚洲成人| 欧美日韩亚洲综合一区二区三区激情在线| japansex久久高清精品| 国产精品91在线观看| 国产一二三在线| 欧美刺激性大交免费视频| 黄色网址在线播放| 亚洲精品久久久一区二区三区| 国产suv一区二区| 在线不卡免费av| 这里只有精品6| 91国模大尺度私拍在线视频| 精品国产免费观看| 亚洲第一久久影院| 黄色一级视频免费| 亚洲美女视频一区| 中文字幕五月天| 最新日韩在线视频| jizz日本在线播放| 中文字幕不卡在线观看| 特级西西www444人体聚色| 久久蜜桃av一区二区天堂| 艳妇乳肉豪妇荡乳xxx| 国产毛片精品视频| 亚洲18在线看污www麻豆| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久久久香蕉| 久久综合婷婷| 北条麻妃av高潮尖叫在线观看| 国产手机视频一区二区| 国产乱子伦农村叉叉叉| 亚洲一区图片| 日本在线视频www| 久久精品亚洲| 欧美性猛交xxx乱久交| 日日噜噜夜夜狠狠视频欧美人| 国产成人精品无码播放| 秋霞午夜鲁丝一区二区老狼| 黄色三级视频在线| 久久成人18免费观看| 中国黄色片一级| 国产一区二三区| 国产一精品一aⅴ一免费| 成人黄色a**站在线观看| 中文字幕一区三区久久女搜查官| 99精品视频一区二区| 女尊高h男高潮呻吟| 国产色婷婷亚洲99精品小说| 日本黄区免费视频观看| 亚洲人亚洲人成电影网站色| 久久久久噜噜噜亚洲熟女综合| 日韩在线观看一区二区三区| 亚洲国产精品成人va在线观看| 午夜影院免费体验区| 亚洲欧美日韩在线高清直播| jizz在线免费观看| 欧美插天视频在线播放| 国产啊啊啊视频在线观看| 亲爱的老师9免费观看全集电视剧| 成人在线高清| 超碰97在线播放| 欧美极品中文字幕| 伊人色综合久久天天五月婷| 在线精品小视频| 欧美 国产 综合| 狠狠色丁香婷婷综合久久片| 女同性αv亚洲女同志| 2023国产精品自拍| 在线观看黄网址| 欧美日韩精品二区| 在线免费看91| 亚洲黄色在线观看| 麻豆影院在线观看| 国内精品视频在线| 国产一区二区三区朝在线观看| 99r国产精品视频| 精品视频免费在线观看| www.xxx麻豆| 男女视频一区二区| 黄色国产在线视频| 国产精品免费av| 久久久午夜影院| 91精品免费在线观看| 日本一区二区三区在线观看视频| 久久久精品一区二区| 亚洲日本天堂| www.久久爱.cn| 日韩国产欧美| 日批视频在线免费看| 国产一区二区三区免费在线观看| 亚洲国产欧美视频| 亚洲黄色小视频| 九九热精品在线| 24小时免费看片在线观看| 国产日韩综合一区二区性色av| 欧美激情15p| 18视频在线观看娇喘| 首页国产欧美久久| 国产一级黄色录像| 一级精品视频在线观看宜春院| 国产精品无码一区| 精品一区电影国产| wwww亚洲| av噜噜色噜噜久久| 亚洲老妇激情| 日韩欧美国产片| 国产精品日韩精品欧美在线| 久久一区二区三区视频| 亚洲白虎美女被爆操| а√天堂官网中文在线| 国产欧美日韩最新| 色88888久久久久久影院| 18禁裸男晨勃露j毛免费观看| 国产美女视频91| 网站永久看片免费| 欧美视频一区二区三区| 成人三级黄色免费网站| 国产成人免费av| 国产成人黄色| 免费日韩视频在线观看| 91丨九色porny丨蝌蚪| 日韩免费不卡视频| 亚洲高清免费观看高清完整版| 麻豆蜜桃在线| 国产精品一区二区av| 伊人久久大香线蕉综合热线 | 综合av色偷偷网| 日韩av电影资源网| 四虎永久国产精品| 免费观看成人av| 懂色av蜜桃av| 欧美色国产精品| 免费看a在线观看| 亚洲一区免费网站| 欧美精品99| 欧美做受高潮中文字幕| 亚洲狠狠爱一区二区三区| 四季av一区二区三区| 亚洲国产合集| 日本一区午夜艳熟免费| 波多野洁衣一区| 黄色在线免费观看| 亚洲无亚洲人成网站77777| 日本美女久久| 男女啪啪的视频| 岛国精品在线播放| 麻豆久久久久久久久久| 亚洲欧美日韩中文在线| 岛国一区二区| 国产精品一二三在线观看| 高清视频一区二区| 丰满少妇乱子伦精品看片| 亚洲欧美制服中文字幕| 黄色精品视频网站| 69精品丰满人妻无码视频a片| 成人黄色国产精品网站大全在线免费观看| 久草手机在线观看| 中文字幕亚洲欧美| 日本成人精品| 欧美亚洲国产成人| 国产精品二区一区二区aⅴ污介绍| 国产精品污视频| 97超碰国产精品女人人人爽| 欧美理论电影大全| 成人一区二区三区仙踪林| 欧美视频13p| 久久黄色美女电影| 精品国产中文字幕| 日本欧美黄色片| 中文字幕一区二区三区色视频| 成人午夜视频一区二区播放| 国产91久久婷婷一区二区| 国产高清一区二区| www.17c.com喷水少妇| 欧美色图片你懂的| 国产桃色电影在线播放| 神马影院我不卡午夜| 丁香五精品蜜臀久久久久99网站| 欧美性猛交bbbbb精品| 欧美成人精品xxx| 国产精品一在线观看|