2017-08-01 50 views
0

调试一些代码我遇到了一个“是IEnumerable”的比较,它在代码中混淆评估为false,但在立即窗口中为true。IEnumerable <type>在代码中为false,但在立即窗口中为true?

我想知道是否有人可以解释为什么会发生这种情况?

实施例:

public enum Fruit 
{ 
    Apples, 
    Strawberries 
} 

public void SomeMethod() 
{ 
    object myObj = new Fruit[] { Fruit.Apples, Fruit.Strawberries }; 

    bool isListOfEnums = myObj is IEnumerable<Fruit>; // True 

    isListOfEnums = myObj is IEnumerable<Enum>; // False in code, but True in Immediate Window when debugged 
} 

(立即窗口)

? myObj is IEnumerable<Enum>  
true 

回答

2

它的中间窗口的怪癖,基本上。有些代码片段的评估方式不同 - 这是我一般不希望使用中间窗口的原因之一。

一个IEnumerable<Fruit>不是IEnumerable<Enum>。后者的每个元素都是参考,因为Enum是一个参考类型(就像ValueType是 - 我知道,它很混乱),而IEnumerable<Fruit>的每个元素都是Fruit值(不是引用)。

+0

感谢Jon,手表在这种情况下似乎也是立即窗口,相信我也不能再相信了。 – mhapps

-1

请尝试快速查看isListOfEnums的价值变化。 或者您可以在即时窗口中多次检查其值。你会看到它正在被正确评估。这是我得到了什么,并认为正常工作: -

?isListOfEnums 
false 
?isListOfEnums 
true 
?isListOfEnums 
false 
  • 当调用public void SomeMethod(),isListOfEnums的价值是 false
  • 经过myObj is IEnumerable<Fruit>;评估后,它变成true
  • myObj is IEnumerable<Enum>;被评估后,它再次成为false
相关问题