为什么Visual Studio Debugger不会枚举BitArray并向我显示结果?

对于以下C#代码行:
BitArray bitty = new BitArray(new[] {false, false, true, false});
如果我在Watch窗口中评估“bitty”,我看不到集合的成员。如果我评价“片断,结果”,这是应该列举IEnumerable和显示结果,我得到的消息,“只有可枚举类型可以有结果视图”,即使BitArray是一个IEnumerable的。 为什么调试器会这样做? CLARIFICAITON:我问的是VS Debugger Expression Evaluator中发生了什么,而不是询问如何在调试器中查看BitArray。     
已邀请:
结果视图仅适用于满足以下条件的集合: 实施
IEnumerable<T>
IEnumerable
(VB.Net仅适用于
IEnumerable<T>
) 不要实施
IList
IList<T>
ICollection
ICollection<T>
(仅限C#限制) 没有
DebuggerTypeProxy
属性 在debugee进程中加载​​System.Core.dll 在这种情况下,
BitArray
同时实现
IEnumerable
ICollection
。后者取消了它与结果视图一起使用的资格。 解决此问题的一种方法是使用
Cast
扩展方法。这将生成一个
IEnumerable<T>
值,您可以从中使用结果视图
bitty.Cast<bool>(), results
#2的原因是多种因素的组合: 结果视图最初是为解决一个非常具体的问题而发明的:C#迭代器(以及扩展LINQ查询)的调试体验很差。根本没有好办法查看
IEnumerable<T>
的内容。 结果视图不是免费的,并且确实存在非常具体的风险。特别是它将热切地和同步地将整个集合加载到存储器中。这可能会导致数据库查询,极大或无限集合支持的集合出现问题 每个已知的
IList/<T>
ICollection<T>
类型都有一个让您查看内容的方法 因此,C#团队决定将风险降至最低,而不是将
IEnumerable<T>
添加到他们认为已经很好地显示的类型中。 VB.Net选择了另一个方向,并将显示任何
IEnumerable<T>
。 您可能会理所当然地询问两个团队如何查看相同的数据并做出不同的决策。它归结为视角,当然还有时间。 VB.Net团队非常热衷于提供出色的LINQ调试体验。 VB.Net在提供丰富的调试+ ENC经验方面有着悠久的历史,因此更习惯/愿意承担此类风险,并且还具有测试它的带宽。 C#只是更加厌恶风险,在时间表上非常紧张,并且务实地决定反对它。 注意:我之前关于
IEnumerable
不被支持的混淆是因为VB表达式求值器实际上就是这种情况。但是,C#表达式求值程序确实支持
IEnumerable
,并且符合上述规则。     

要回复问题请先登录注册