接口方法和记录属性的XML文档

时间:2013-11-16 08:53:08

标签: f# intellisense c#-to-f#

似乎XML文档适用于大多数情况,但并非总是如此。我想让Intellisense完全可用于为与C#进行互操作而设计的部件。所以,这是一个小的(也许有点人为的)例子:

///<summary>Well, it's a summary</summary>
type Summary = {
    ///<summary>Gets a short name</summary>
    Name : string;

    ///<summary>Gets whether the action was successful or not</summary>
    IsSuccessful : bool;
}

///<summary>Represents path filtering action</summary>
type IPathFilter =
    ///<summary>Runs the filtering through the list of <paramref name="paths"/></summary>
    ///<param name="paths">A sequence of paths to check</param>
    ///<returns>A sequence of <see cref="Summary"/></returns>
    abstract member Run : seq<string> -> seq<Summary>

///<summary>A default filter</summary>
type PathFilter =

    ///<summary>Runs the filtering through the list of <paramref name="paths"/></summary>
    ///<param name="paths">A sequence of paths to check</param>
    ///<returns>A sequence of <see cref="Summary"/></returns>
    member this.Run paths=
        paths |> Seq.map (fun s -> FileInfo(s)) |> Seq.map (fun f -> { Name = f.Name; IsSuccessful = f.Exists; })

    interface IPathFilter with
        ///<summary>Runs the filtering through the list of <paramref name="paths"/></summary>
        ///<param name="paths">A sequence of paths to check</param>
        ///<returns>A sequence of <see cref="Summary"/></returns>
        member this.Run paths = 
            this.Run paths

类和接口只适用于C#interop,它是F#库中发生的所有神奇内容的外观,因此我不必将F#特定的东西暴露给C#。在C#端提供完整的文档会很好,这让我想到了两个问题:

  1. 有没有办法在Intellisense中记录和显示记录属性?如果我将鼠标悬停在类型本身上,一切正常,但似乎没有拾取属性: Record 'class' documentation enter image description here

  2. 有没有办法对抽象方法进行“完整”描述?我知道,从F#侧来看,它们只被描述为功能签名。不幸的是,这意味着如果我使用界面,我会得到关于该方法的不完整的文档;参数名称和描述将丢失:

    Interface method doc

    与原始类文档相比: Class method doc

  3. 我能做些什么,或者我应该学会忍受它? :)


    [编辑]

    正如Gustavo所述,记录文档似乎在F#端工作正常(使用VS2012 Professional检查):

    FSharp record doc

    不幸的是,在C#中

    FSharp record doc in CSharp

    :(

2 个答案:

答案 0 :(得分:2)

请注意,如果您没有summaryparams等其他标记,则可以省略returns标记。所以这个:

///Well, it's a summary
type Summary

相当于:

///<summary>Well, it's a summary</summary>
type Summary

1)记录字段的描述适用于VS2012:

enter image description here

2)您可以在抽象方法中使用参数名称,如下所示:

type IPathFilter =
    abstract member Run : paths:seq<string> -> seq<Summary>

答案 1 :(得分:1)

正如PatrykĆwiek在上述评论中指出的那样,微软已经证实这是一个错误。只是为了澄清实际发生的情况:当F#编译器生成文档文件时,它实际上记录了内部字段而不是记录成员的公共属性

例如,上面的Summary类型的文档生成为:

...
<member name="F:Test.Summary.IsSuccessful">
   <summary>Gets whether the action was successful or not</summary>
</member>
<member name="F:Test.Summary.Name">
   <summary>Gets a short name</summary>
</member>
<member name="T:Test.Summary">
   <summary>Well, it's a summary</summary>
</member>
...

请注意成员名称文档中的F:前缀。将其更改为P:,Visual Studio会立即在C#项目中显示注释。因此,在修复此错误并实际为属性生成文档之前,您唯一的选择是在构建后步骤中手动处理文档文件。

顺便说一句,这也解释了为什么它在F#中工作:显然,Visual Studio的F#绑定使用该字段来查找文档。这甚至适用于几个F#库,尽管该字段具有内部可见性。

更新:应使用F#3.1.2修复此错误。另请参阅the release notes