调试一些代码 我遇到了一个"是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
基本上,这是中间窗口的怪癖。有一些代码段的评估方式不同 - 这是我通常不喜欢使用中间窗口的原因之一。
IEnumerable<Fruit>
不是IEnumerable<Enum>
。后者的每个元素都是一个引用,因为Enum
是一个引用类型(就像ValueType
一样 - 我知道,这很令人困惑(,而IEnumerable<Fruit>
的每个元素都是一个Fruit
值(不是引用(。
尝试快速观察以查看isListOfEnums
值的变化。 或者,您可以在即时窗口中多次检查其值。您将看到它正在被正确评估。这就是我得到的,并认为正常工作:-
?isListOfEnums
false
?isListOfEnums
true
?isListOfEnums
false
- 调用
public void SomeMethod()
时,isListOfEnums 的值为false
. - 评估
myObj is IEnumerable<Fruit>;
后,它变为true
。
评估 myObj is IEnumerable<Enum>;
后,它会再次false
。