IEnumerable <type>在代码中为false,但在立即窗口中为true?

时间:2017-08-01 08:44:04

标签: c# ienumerable immediate-window

调试一些代码我遇到了一个“IEnumerable”比较,这在代码中容易引起误判,但在立即窗口中是真的。

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

示例:

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 个答案:

答案 0 :(得分:3)

基本上是中间窗口的怪癖。有一些代码在那里进行不同的评估 - 这是我通常不喜欢使用中间窗口的一个原因。

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

答案 1 :(得分:-1)

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

?isListOfEnums
false
?isListOfEnums
true
?isListOfEnums
false
  • 调用public void SomeMethod()时,isListOfEnums的值为 false
  • 在评估myObj is IEnumerable<Fruit>;后,它变为true
  • 在评估myObj is IEnumerable<Enum>;之后,它再次成为false