簡體   English   中英

為什么IEnumerable的匿名類型不返回List <object> 在ToList()?

[英]Why doesn't IEnumerable of anonymous types return a List<object> on ToList()?

這是我想要創建的簡化函數:

static List<object> GetAnonList(IEnumerable<string> names)
{
    return names.Select(name => new { FirstName = name }).ToList();
}

在該代碼塊中,我得到編譯器錯誤:

錯誤CS0029無法將類型'System.Collections.Generic.List <>'隱式轉換為'System.Collections.Generic.List'

在匿名類型的文檔中,它表示匿名類型被視為類型對象。 為什么C#編譯器沒有在names.ToList()上返回List<object>

此外,為什么以下代碼不會導致錯誤? 如果List<<anonymous type: string FirstName>>無法轉換為List<object> ,那么為什么它可以轉換為IEnumberable<object>

static IEnumerable<object> GetAnonList(IEnumerable<string> names)
{
    return names.Select(name => new { FirstName = name }).ToList();
}

如果List<<anonymous type: string FirstName>>無法轉換為List<object> ,那么為什么它可以轉換為IEnumberable<object>

那是因為IEnumerable<T>是協變的而List<T>不是。 它與匿名類型無關。

如果你編寫的代碼是工作的,你可以使用List<string>作為List<object>並添加任何東西來打破類型安全。

您可以通過將泛型類型參數傳遞給ToList調用來使代碼工作:

static List<object> GetAnonList(IEnumerable<string> names)
{
    return names.Select(name => new { FirstName = name }).ToList<object>();
}

但是除了這種方法之外,你幾乎無法做到這一點。 除非使用反射,否則您將無法訪問FirstName屬性。

IEnumerable<out T> IEnumerable(T)Document

List<T> 列表(T)文檔

請注意,IEnumerable接口上有“out”Generic Modifier,它允許您將更多派生類型放入IEnumerable。

(通用修飾符)(C#參考)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM