一段C#代码
var isTrue = (new List<int>{1,2,3} is IEnumerable<object>);
我在代码执行中得到了结果false
,
但是当我将该代码复制到WATCH窗口时,结果为true
。
答案 0 :(得分:1)
这不是一个完整的答案(我不知道这个错误出现的原因),但它揭示了调试器的不稳定行为,这显然是错误的。
首先:C#不允许(和AFAIK,也是CLR)类型方差involvig值类型;只有在涉及的类型之间存在标识保留转换时才允许使用方差,否则它将失败(没有为值类型保留转换的身份):
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
?因为有一个bug,句号。
当new int[] { 1, 2, 3 } is IEnumerable<object>
可隐式转换为false
与int[]
相同时,IEnumerable<int>
会将List<int>
更正为false
,这更令人困惑。
我找到后者正确行为的唯一原因是编译器已经将该表达式标记为始终IEnumerable
并带有警告,因此编译器分析阵列场景的方式与其他任何{{1}不同}。