IEnumerable<out T>這個接口非常常見,它是最基礎(chǔ)的泛型集合接口,表示可迭代的項的序列。
但是奇怪的是為什么泛型參數(shù)要帶一個“out”?
經(jīng)過一番資料查閱后,發(fā)現(xiàn)此“out”和C#中的“out”類型參數(shù)的“out”并非一個意思。
IEnumerable<out T>中的out表示這個接口支持“協(xié)變性”。
何謂“協(xié)變性”?
簡單的理解就是“T”可以變化為T的基類型。說了這么多,感覺還是很抽象,用一段代碼表示吧。
IEnumerable<int> collection1 = new List<string>();IEnumerable<object> collection2 = collection1;
在C#4.0之前,由于IEnumerable<T>的聲明并未包含“out”關(guān)鍵字,所以上面的代碼是無法通過編譯的,編譯器會告知你類型轉(zhuǎn)換失敗,因為collection2對應(yīng)的類型為IEnumerable<object>,而collection1對應(yīng)的類型為IEnumerable<int>。其實這個問題并不是多么深刻,因為現(xiàn)在絕大部分C#開發(fā)者用的都是C# 5,就會很“理所當(dāng)然”的覺得collection1可以轉(zhuǎn)化為collection2。我也是,直至查閱資料研究“out”這個關(guān)鍵字才發(fā)現(xiàn)之所以可以實現(xiàn)這樣轉(zhuǎn)換的原因。
轉(zhuǎn)載聲明:本文轉(zhuǎn)載自http://www.zhoumy.cn/?id=5
新聞熱點
疑難解答