簡體   English   中英

為什么C#不允許匿名轉換為對象?

[英]Why does C# not allow anonymous cast to objects?

我想知道不允許這種轉換的原因。 SO的這篇文章中已經談到了這個主題,但是我想對為什么這在本機上不可能做一個低級的解釋。

為什么這些強制轉換失敗?

OBS:我知道可以通過反思來做到這一點。

IList<People> peopleList = new List<People>()
{
    new People() { Name = "Again", Age = 10 },
    new People() { Name = "Over", Age = 20 },
    new People() { Name = "Jonh", Age = 30 },
    new People() { Name = "Enzo", Age = 40 },
};

var anonymous = (from p in peopleList
                select new
                {
                    Name = p.Name,
                    Age = p.Age
                });

// Does not work
IList<People> listt = (IList<People>)anonymous; 
//Does not Work
IList<People> listt = (anonymous as List<People>);

問題是為什么不能將anonymous成功轉換為IList<People>List<People>

  • 查詢表達式的值是可以執行查詢的對象 它不是查詢執行的結果集。 anonymous實現IEnumerable<T> ,而不是IList<T>並且肯定不是子類List<T> 因此,不能將其IList<T>為任何IList<T>List<T>類型。 如果那是您想要的,則使用ToList()執行查詢並將結果集存儲在列表中。
  • 可以將查詢強制轉換為IEnumerable<People>嗎? 否。它是一系列匿名類型的對象,已復制與People相關聯的某些值。 因此,這是一系列匿名對象,而不是一系列人。

我還注意到,在新的C#7代碼中,如果可以在應用程序中使用元組而不是匿名類型,則是更好的做法。 它們在類型系統中具有更好的支持,並產生較小的收集壓力。

暫無
暫無

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

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