c# – 将对象转换为IEnumerable

前端之家收集整理的这篇文章主要介绍了c# – 将对象转换为IEnumerable前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > VS debug issue,who can help me to explain this below?1个
以下是我遇到的问题的简化版本:
var list = new List<int> {1,2,3,4,5};
// list Count = 5 System.Collections.Generic.List<int>

var obj = list as object;
// obj  Count = 5   object {System.Collections.Generic.List<int>}

var enumerable = obj as IEnumerable<object>;
// enumerable   null    System.Collections.Generic.IEnumerable<object>

注释是Visual Studio 2017中监视窗口中的值

但是,如果我输入:

obj as IEnumerable<object>

在观察窗口,我得到:

obj as IEnumerable<object>  Count = 5   System.Collections.Generic.IEnumerable<object> {System.Collections.Generic.List<int>}

那么为什么我可以在监视窗口中投射它并且它可以工作,但如果我在代码中执行它,它的计算结果为null?

解决方法

C# documentation

Variance in generic interfaces is supported for reference types only. Value types do not support variance. For example,IEnumerable<int> cannot be implicitly converted to IEnumerable<object>,because integers are represented by a value type.

这里有什么有用的知识是,以下两件事是非常不同的操作:

var l = (object) new List<int>();
var i = (object) 42;

尽管语法看起来一样.第一行仅将列表视为另一种类型(有些检查转换是否实际可以工作),而第二行将整数转换为包含它的对象(装箱).还有第三个变体,它调用转换运算符,但看起来仍然相同.由于第一个变体可以随意改变对象并且只是以不同方式解释它,它比第二个变体便宜得多.我猜这个上下文中唯一可以用于接口协方差的选项.

原文链接:https://www.f2er.com/csharp/91342.html

猜你在找的C#相关文章