0

调试一些代码时,我遇到了一个“是 IEnumerable”比较,它在代码中令人困惑地评估为 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
4

2 回答 2

3

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

一个IEnumerable<Fruit> 不是一个IEnumerable<Enum>。后者的每个元素都是引用,Enum引用类型也是如此(就像ValueTypeis - 我知道,这很令人困惑),而 an 的每个元素IEnumerable<Fruit>都是一个Fruit值(不是引用)。

于 2017-08-01T08:50:10.313 回答
-1

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

?isListOfEnums
false
?isListOfEnums
true
?isListOfEnums
false
  • public void SomeMethod()被调用时,isListOfEnums 的值为 false.
  • 经过myObj is IEnumerable<Fruit>;评估,它变成true.
  • 评估后myObj is IEnumerable<Enum>;,它false再次beomes。
于 2017-08-01T09:15:46.650 回答