泛型協變和逆變3

2021-09-29 05:47:14 字數 1231 閱讀 4296

原文

01.協變性指的是——泛型型別引數可以從乙個派生類隱式轉化為基類(子類可以隱式的轉換為父類)

例如string 可以轉化為object

在c#4.0中引入out關鍵字來標記泛型引數支援協變性

// list.addrange(ienumerable)方法 

//將其元素新增到 list的末尾的集合。 集合自身不能為 null

//但它可以包含為 null 的元素(如果型別 t 為引用型別)

//如果新 count (當前 count 加上集合的大小)將大於 capacitylist

//則會自動重新分配內部陣列以容納新元素並將現有元素在新增新元素之前複製到新陣列

list<

int>list=

newlist

<

int>()

; list<

int> newlist=

newlist

<

int>()

; list.

addrange

(newlist)

;foreach

(var item in list)

//1 2 3 5 6 7

static

void

main

(string

args)

**中如果使用 這**時 liststrs.addrange(listobject); 就會出現編譯時錯誤(無法從list轉換為ienumerable,因為list可以因為繼承的協變性轉化為ienumerable,但是因為ienumerable不支援逆變,即從object到string的轉化,所以此時就會產生下面圖中的錯誤

2.逆變

泛型型別引數可以從乙個基類隱式轉化為派生類

在c# 4.0中引入in關鍵字來標記泛型引數支援逆變性.為了更好的說明泛型的逆變性

class

program

}public

class

testcomparer

:icomparer

<

object

>

}

C 泛型的協變和逆變

可變性是以一種型別安全的方式,將乙個物件當做另乙個物件來使用。如果不能將乙個型別替換為另乙個型別,那麼這個型別就稱之為 不變數。協變和逆變是兩個相互對立的概念 在c 4.0之前,所有的泛型型別都是不變數 即不支援將乙個泛型型別替換為另乙個泛型型別,即使它們之間擁有繼承關係,簡而言之,在c 4.0之前...

協變和逆變

協變和逆變都是術語,前者指能夠使用比原始指定的派生型別的派生程度更大的型別,後者指能夠使用比原始指定的派生型別的派生程度更小的型別。using system using system.collections.generic using system.text class derived base s...

協變和逆變

二 真正的協變和逆變 概念 1 以前的泛型系統 或者說沒有in out關鍵字時 是不能 變 的,無論是 逆 還是 順 協 2 當前僅支援介面和委託的逆變與協變 不支援類和方法。但陣列也有協變性。3 值型別不參與逆變與協變。協變 foo foo public class testoutwhere t ...