参见英文答案 >
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 toIEnumerable<object>
,because integers are represented by a value type.
这里有什么有用的知识是,以下两件事是非常不同的操作:
var l = (object) new List<int>(); var i = (object) 42;
尽管语法看起来一样.第一行仅将列表视为另一种类型(有些检查转换是否实际可以工作),而第二行将整数转换为包含它的对象(装箱).还有第三个变体,它调用转换运算符,但看起来仍然相同.由于第一个变体可以随意改变对象并且只是以不同方式解释它,它比第二个变体便宜得多.我猜这个上下文中唯一可以用于接口协方差的选项.