代码之家  ›  专栏  ›  技术社区  ›  Tim Robinson

在监视窗口中显示序列

  •  5
  • Tim Robinson  · 技术社区  · 14 年前

    有没有办法让visualstudio调试器显示F的内容# seq 表情?

    Visual Studio了解 IEnumerable<T> 对象,并在监视窗口中提供结果视图。如果你在监视窗口中看到其中一个,你会看到一堆私人领域。

    一些潜在的替代方案:

    • fsi.exe 在打印序列方面做得很好,但它不与调试器交互
    • 想办法打电话 Seq.toArray 从调试器内部。我找不到合适的语法从即时窗口调用它。
    • 写一个可视化者。我不知道是否可以将Vizualiser附加到Microsoft类型。
    • 还有什么。。。?

    进一步的调查显示F#的 序号 IEnumerable<T> 很好——它们会出现在监视窗口中——但是由于某些原因,结果视图不会出现。

    然而,F# 对象似乎不是普通的IEnumerables;相反,它们看起来是来自函数内部的闭包 Seq 序号 对象看起来是使用 { new IEnumerable with ... } .)

    4 回复  |  直到 14 年前
        1
  •  8
  •   JaredPar    14 年前

    Results 在VisualStudio2008中添加的视图节点。如果System.Core.dll被加载到进程中,任何实现 IEnumerable<T> 展开时将获得一个额外的节点 结果 . 展开该节点将枚举 IEnumerable<T> 并显示结果。

    F#类型 seq IEnumerable<T> 所以它得到了同样的好处。

    results view

    // Force System.Core into the process
    let x = typeof<System.Linq.Enumerable>
    
        2
  •  3
  •   desco    14 年前

    测试环境:

    let get s = 
        for x in s do // breakpoint is set here
            printfn "%A" s
    
    get <| seq {for i in 1..10 -> i}
    

    Microsoft.FSharp.Collections.SeqModule.ToArray(s)
    

    或者您可以添加这一行以确保System.Core 已加载(和System.Linq.Enumerable (无障碍)

    let s : System.Linq.Expressions.Expression = Unchecked.defaultof<_>
    

    System.Linq.Enumerable.ToList(s)
    
        3
  •  2
  •   Mauricio Scheffer    14 年前

    您可以通过将seq放入列表来强制进行评估。假设 q 是一个 seq<int>

    new System.Collections.Generic.List<int>(q)

    顺便说一句: seq IEnumerable . 如prim中所定义-类型.fsi:

    /// <summary>An abbreviation for the CLI type <c>System.Collections.Generic.IEnumerable&lt;_&gt;</c></summary>
    type seq<'T> = IEnumerable<'T>
    
        4
  •  2
  •   Laurent Bourgault-Roy    14 年前

    好吧,它们看起来像闭包的原因是因为它们就是这样的:在代码中实际使用seq之前,不会对seq求值。你可以有一个无限的seq,这需要很长时间才能在调试器中显示出来。而且由于评估有一些副作用并不是不可能的,因此正确评估它们会导致问题,这些问题只会在调试器或实际代码中出现,而不会在两者中都出现。