VS调试问题,谁能帮我解释一下这个?

Ray*_* He 9 c# debugging

一段C#代码

var isTrue = (new List<int>{1,2,3} is IEnumerable<object>);
Run Code Online (Sandbox Code Playgroud)

我得到false了代码执行的结果,但是当我将该代码复制到WATCH窗口时,结果是true.

InB*_*een 1

这不是一个完整的答案(我不知道这个错误出现的原因),但它揭示了调试器的不稳定行为,这显然是有问题的。

首先也是最重要的:C# 不允许(据我所知,CLR 也是如此)涉及值类型的类型差异;仅当涉及的类型之间存在身份保留转换时才允许方差,否则将会失败(值类型没有身份保留转换):

object[] oo = new int[] {1, 2, 3}; //will fail
IEnumerable<object> oo = new int[] {1, 2, 3}; //will fail
Run Code Online (Sandbox Code Playgroud)

调试器的立即窗口显然是错误的,应该像运行时一样new List<int> { 1, 2, 3 } is IEnumerable<object>返回。false为什么又回来了true?因为有一个错误,就这样。

更令人困惑的是,当隐式转换为与相同时,new int[] { 1, 2, 3 } is IEnumerable<object>将正确返回。falseint[]IEnumerable<int>List<int>

我发现后一种正确行为的唯一原因是编译器已经像往常一样标记了该表达式false并带有警告,因此编译器分析数组场景的方式与任何其他IEnumerable.