调试一些代码我遇到了一个“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
答案 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
。