gpt4 book ai didi

c# - Cast List 和 Cast IEnumerable 有什么区别
转载 作者:太空狗 更新时间:2023-10-30 00:18:30 24 4
gpt4 key购买 nike

我试图从对象(对象包含 List<Apple> )转换为 List<object> , 它失败并出现异常:

Unable to cast object of type 'System.Collections.Generic.List[list_cast_object_test.Apple]' to type 'System.Collections.Generic.List[System.Object]'.

当我替换了 ListIEnumerableIList (一个接口(interface))它运行良好,我不明白其中的区别....

代码如下:

    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; }
}

有人可以解释一下这是怎么回事吗?转换为通用接口(interface)和转换为通用类有什么区别?

最佳答案

这是因为在IEnumerable<T> TList<T> 中是协变的T不支持协方差。

查看更多关于 Covariance and Contraviance in c# 的信息

如果你想做那样的事情,那么你必须使用 ToList<T>()重载会将其包装为对象类型,例如:

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

这里我们可以转换List<Apple>List<Object>由于新List<T>创作地点T类型为 Object但我们不能投出原来的 List<Apple>引用List<object> .

在这种情况下,它将创建 Object 的实例type 并将对您的类型的引用存储为类型的引用 object ,但在值类型或结构的情况下,它将有装箱成本。

关于c# - Cast List<object> 和 Cast IEnumerable<object> 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35177476/

24 4 0