C# 中為什麼List<List<T>> 不能轉換為 IList<IList<T>> ?
因為IList&
public interface IList&
從 List&&> 轉成 IList&
&> 是完全沒問題的,因為這個轉換從泛型參數的角度看是invariant的。然而進一步轉成 IList&
傳送門:Covariance and Contravariance in Generics
具體到題主的例子,其實這樣就好了:using System.Collections.Generic;
using System.Linq;
class Record {
public List&
get { return null; }
}
}
class Program 這是因為我的例子中,ToList()其實是個泛型方法,其泛型參數通常是被自動推導出來的;Record.Data的類型是List&
{
static void Main(string[] args) {
var records = new List&
var casted1 = (IList&
Console.WriteLine("cast1 succeeded.");
var casted2 = (IList&
Console.WriteLine("cast2 succeeded.");
var casted3 = (IList&
Console.WriteLine("cast3 succeeded.");
}
}
&>。我們要麼在Select()的時候就as一下來讓Select推導出來的類型改變,要麼直接在ToList()的地方指定清楚泛型參數,就好啦。
C#裡面只有數組可以做類似的錯誤轉換。不能賺的原因很簡單,IList&
- &>,拿出來那應該是什麼?
List&
舉個例子,有一個方法接收 IList&
我來這麼舉例吧:
已知Collection&
那麼因為IList&&>進行Add(Collection&
由此可見List&&>不滿足IList&
另外,這種covariant的轉換在out-only的介面上是可行的。既,List&&>可以轉換為IReadOnlyList&
推薦閱讀:
※為什麼很多人認為.NET就是拖控制項?
※C#為什麼總不被看好?
※如何提高unity開發水平?
※編程該怎麼學下去(C#)?
TAG:C# |