簡體   English   中英

Cast List之間的區別是什么? <object> 和Cast IEnumerable <object>

[英]What is the difference between Cast List<object> and Cast IEnumerable<object>

我試圖從對象(該對象包含List<Apple> )轉換為List<object> ,但它失敗並出現異常:

無法將類型為“System.Collections.Generic.List [list_cast_object_test.Apple]”的對象強制轉換為“System.Collections.Generic.List [System.Object]”。

當我用IEnumerableIList (一個接口)替換List ,它運行良好,我不明白它的區別....

代碼如下:

    private void Form1_Load(object sender, EventArgs e) {
        object resultObject = GetListAsObject();

        // this cast works fine, it's normal...
        var resAsIt = (List<Apple>)resultObject;

        // also when I use a generic interface of 'object' cast works fine
        var resAsIEnumerable = (IEnumerable<object>)resultObject;

        // but when I use a generic class of 'object' it throws me error: InvalidCastException
        var resAsList = (List<object>)resultObject;
    }

    private object GetListAsObject() {
        List<Apple> mere = new List<Apple>();
        mere.Add(new Apple { Denumire = "ionatan", Culoare = "rosu" });
        mere.Add(new Apple { Denumire = "idared", Culoare = "verde" });
        return (object)mere;
    }
}
public class Apple {
    public string Denumire { get; set; }
    public string Culoare { get; set; }
}

有人可以解釋一下它發生了什么? 強制轉換為通用接口和強制轉換為泛型類有什么區別?

這是因為在IEnumerable<T> T是協變的,而在List<T> T中不支持協方差。

在c#中查看有關Covariance和Contraviance的更多信息

如果你想做那樣的事情,你必須使用ToList<T>()重載,它將它包裝到對象類型,如:

 List<object> result = resultObject.ToList<object>();

由於新的List<T>創建,我們能夠將List<Apple>轉換為List<Object> ,其中TObject類型但我們不能將原始的List<Apple>引用轉換為List<object>

在這種情況下,它會創建的實例Object類型以及將存儲參考你的類型為類型的參考object ,但值類型或strcuts的情況下,將有拳擊成本。

IEnumerable<T>是一個接口,由於類型T被定義為協變(它實際上是IEnumerable<out T> ,請注意out ),你可以將T轉換為基本實現,因此IEnumerable<object是一個有效的強制轉換您的List<Apple>類型List<Apple>

但是,類型List<Apple>不等於List<object>類型,列表List<Apple>也不是從List<object>派生的。 List<T>上的類型參數不是協變的,因此強制轉換是無效的。

演員收到 object 到列表<object>或 IEnumerable<object><div id="text_translate"><p> 我正在嘗試執行以下演員</p><pre>private void MyMethod(object myObject) { if(myObject is IEnumerable) { List&lt;object&gt; collection = (List&lt;object&gt;)myObject; ... do something } else {... do something } }</pre><p> 但我總是以以下異常結束:</p><p> 無法將“System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.List</p><p> 我真的需要這個工作,因為這個方法需要非常通用才能接收單個對象和 collections 兩種未指定的類型。</p><p> 這是可能的,還是有另一種方法可以做到這一點。</p><p> 謝謝你。</p></div></object></object>

[英]Cast received object to a List<object> or IEnumerable<object>

將 object 投到列表中<object><div id="text_translate"><p>由於某些我無法控制的原因,需要定義我的一種方法來接受 object 類型的一個參數。 但我知道這個參數的值實際上是 List 類型,帶有一個我不知道的通用參數。</p><p> 我正在嘗試將此 object 轉換為 List&lt;object&gt;,但不知道如何在不知道確切的通用參數是什么的情況下執行此操作。</p><p> 我想做這樣的事情:</p><pre> public static List&lt;object&gt; ConvertToList(object input) { if (input.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List&lt;&gt;))) { //Of course this does not work, because input might for example be of type List&lt;string&gt; return (List&lt;object&gt;) input; } else { return null; } }</pre><p> 我知道,如果我有List&lt;T&gt;而不是object input ,使用以下方法會很容易:</p><pre> return input.Cast&lt;object&gt;()</pre><p> 但不幸的是,我堅持使用 object 參數。 知道如何解決這個問題嗎?</p></div></object>

[英]Cast object to List<object>

暫無
暫無

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

相關問題 投IEnumerable <object> 列表 <object> 演員收到 object 到列表<object>或 IEnumerable<object><div id="text_translate"><p> 我正在嘗試執行以下演員</p><pre>private void MyMethod(object myObject) { if(myObject is IEnumerable) { List&lt;object&gt; collection = (List&lt;object&gt;)myObject; ... do something } else {... do something } }</pre><p> 但我總是以以下異常結束:</p><p> 無法將“System.Collections.Generic.List 1[MySpecificType]' to type 'System.Collections.Generic.List</p><p> 我真的需要這個工作,因為這個方法需要非常通用才能接收單個對象和 collections 兩種未指定的類型。</p><p> 這是可能的,還是有另一種方法可以做到這一點。</p><p> 謝謝你。</p></div></object></object> null轉換和默認對象之間有什么區別 將對象轉換為IEnumerable <object> ? 從IEnumerable轉換為IEnumerable <object> 將對象轉換為IEnumerable 如何投射IEnumerable <object> 到一個IEnumerable <runtime type> 為什么IEnumerable <struct> 轉換為IEnumerable <object> ? 將 object 投到列表中<object><div id="text_translate"><p>由於某些我無法控制的原因,需要定義我的一種方法來接受 object 類型的一個參數。 但我知道這個參數的值實際上是 List 類型,帶有一個我不知道的通用參數。</p><p> 我正在嘗試將此 object 轉換為 List&lt;object&gt;,但不知道如何在不知道確切的通用參數是什么的情況下執行此操作。</p><p> 我想做這樣的事情:</p><pre> public static List&lt;object&gt; ConvertToList(object input) { if (input.GetType().GetGenericTypeDefinition().IsAssignableFrom(typeof(List&lt;&gt;))) { //Of course this does not work, because input might for example be of type List&lt;string&gt; return (List&lt;object&gt;) input; } else { return null; } }</pre><p> 我知道,如果我有List&lt;T&gt;而不是object input ,使用以下方法會很容易:</p><pre> return input.Cast&lt;object&gt;()</pre><p> 但不幸的是,我堅持使用 object 參數。 知道如何解決這個問題嗎?</p></div></object> 將對象強制轉換為IEnumerable <T> 我知道T是什么
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM