一段C#代码
var isTrue = (new List<int>{1,2,3} is IEnumerable<object>);
我得到了结果false
在代码执行中,
但是当我将该代码复制到 WATCH 窗口时,结果是true
.
这不是一个完整的答案(我不知道这个错误出现的原因),但它揭示了调试器的不稳定行为,这显然是有问题的。
首先也是最重要的:C# 不允许(据我所知,CLR 也是如此)涉及值类型的类型差异;仅当涉及的类型之间存在身份保留转换时才允许方差,否则将会失败(值类型没有身份保留转换):
object[] oo = new int[] {1, 2, 3}; //will fail
IEnumerable<object> oo = new int[] {1, 2, 3}; //will fail
调试器的立即窗口显然是错误的,new List<int> { 1, 2, 3 } is IEnumerable<object>
应该返回false
就像运行时一样。为什么又回来了true
?因为有一个错误,就这样。
更让人困惑的是,new int[] { 1, 2, 3 } is IEnumerable<object>
会正确返回false
when int[]
可以隐式转换为IEnumerable<int>
与...一样List<int>
.
我发现后一种正确行为的唯一原因是编译器已经一如既往地标记了该表达式false
带有警告,因此编译器分析数组场景的方式与任何其他情况不同IEnumerable
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)