程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# 4.0中泛型協變性和逆變性詳解(1)

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

編輯:關於C語言

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

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

恆定性,協變性和逆變性

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

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

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

public static void PrintOutput(object thing)
{

if (thing != null)

Console.WriteLine(thing);

}

// elsewhere:

PrintOutput(5);

PrintOutput("This is a string");

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

object value = SomeMethod();

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

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