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

一段C#代码

var isTrue = (new List{1,2,3} is IEnumerable); 

我在代码执行中得到结果为false ,但是当我将该代码复制到WATCH窗口时,结果为true

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

首先是:C#不允许(和AFAIK,也是CLR)类型方差involvig值类型; 只有在所涉及的类型之间存在标识保留转换时才允许使用方差,否则它将失败(对于值类型没有保留转换的身份):

 object[] oo = new int[] {1, 2, 3}; //will fail IEnumerable oo = new int[] {1, 2, 3}; //will fail 

调试器的立即窗口显然是错误的, new List { 1, 2, 3 } is IEnumerable应该在运行时返回false 。 它为什么回归true ? 因为有一个bug,一段时间。

令它更令人困惑的是, new int[] { 1, 2, 3 } is IEnumerableint[]可以隐式转换为与List相同的IEnumerable时,correclty将返回false

我找到后者正确行为的唯一原因是编译器已经将该表达式标记为始终为false并带有警告,因此编译器分析arrays场景的方式与任何其他IEnumerable不同。