Dot-Net-4.0

為什麼我不能在 .NET 4.0 中將 List<int> 分配給 IEnumerable<object>

  • July 3, 2014

我嘗試這樣做:

IEnumerable&lt;object&gt; ids = new List&lt;string&gt;() { "0001", "0002", "0003" };

效果很好!

但是當我嘗試這樣做時:

IEnumerable&lt;object&gt; intIds = new List&lt;System.Int32&gt;() { 1, 2, 3 };

Visual Studio 告訴我:無法將類型“System.Collections.Generic.List”隱式轉換為“System.Collections.Generic.IEnumerable”。存在顯式轉換(您是否缺少演員表?)

這是為什麼?

int是一種值類型,只能裝箱object- 它不繼承自object. 由於您IEnumerable&lt;object&gt;無論如何都在使用,這應該可以工作:

IEnumerable intIds = new List&lt;int&gt;() { 1, 2, 3 };

簡單地說:.NET 4 中的泛型變體不支持作為值類型的類型參數的變體。

它可以用於引用類型的原因是,一旦 CLR 確定它知道泛型轉換是安全的,它就可以以相同的方式處理所有引用值——它們在內部具有相同的表示。將引用轉換為引用不需要實際的轉換,反之亦然,如果您知道它絕對是對字元串的引用 - 基本上是相同的位。因此,生成的本機程式碼可以將引用視為引用,很高興知道有關變異數的規則已經保證在類型安全級別上不會發生任何令人討厭的事情,並且不對值本身執行任何轉換。string``object

對於值類型轉換不是“引用轉換”(即保留表示的轉換)的引用類型,情況*並非如此。*這就是為什麼你不能順便寫…IEnumerable&lt;XName&gt; names = new List&lt;string&gt;();

引用自:https://stackoverflow.com/questions/8175311