從Hop
投射到IHop
是微不足道的一個隱式 - 無需語法。同樣,從List<Hop>
轉換爲IList<Hop>
也是微不足道的。
但是,你不能簡單地投下List<Hop>
到List<IHop>
(或IList<...>
),因爲它們互不兼容。編譯器犯錯誤阻止你:一個List<Hop>
只能包含Hop
S(或Hop
子類) - 然而,List<IHop>
可以包含我的隨機SomeClass : IHop
。如果該投工作,它將使:
List<Hop> hops = ...
List<IHop> evil = hops;
evil.Add(new SomeClass()); // boom!
class SomeClass : IHop { } // but not a Hop
基本上,您將需要重新創建不同類型的列表。 ConvertAll
可能是使用:
List<Hop> hops = ...
List<IHop> ihops = hops.ConvertAll(x => (IHop)x);
// or: IList<IHop> ihops = ...
您也可以使用(也許更方便,但效率較低):
var ihops = hops.Cast<IHop>().ToList();
其他:注意IEnumerable<out T>
和IReadOnlyList<out T>
可以直接投,由於差異:
IReadOnlyList<Hop> hops = ...
IReadOnlyList<IHop> ihops = hops; // just works
從「跳躍」到「IHop」的投射是微不足道的,也是隱含的 - 它不需要任何語法(儘管*有*顯式語法,如果你願意的話)。我懷疑你是什麼*** ***居然試圖做的是投了'名單'/'IList的'的'名單'/'的IList '。我會說得對嗎?這是一個非常* *不同的問題... –
2014-12-04 08:01:40
@MarcGravell我想演員名單到IList的,至少那個版本是給我一個運行時錯誤,當我嘗試它。 –
akc42
2014-12-04 08:05:24