IEnumerable<type> 在代码中是假的,但在即时窗口中是真的?



调试一些代码 我遇到了一个"是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

相关内容

  • 没有找到相关文章

最新更新