特别是,我想为这种类型编写扩展方法:

type Frame<'TRowKey, string when 'TRowKey : equality> with
  member frame.someMethod =
    // code

有了该代码,我得到了这个错误:

类型名称中的意外标识符。预期的中缀运算符,引号或其他标记。

string替换String可获得相同的结果。

原始类型是Deedle库中的Frame<'TRowKey, 'TColumnKey (requires equality and equality)>

最佳答案

我没有Deedle来测试此代码,但您应该使用.NET扩展方法:

open System

[<Runtime.CompilerServices.Extension>]
module Extensions =
    [<Runtime.CompilerServices.Extension>]
    let someMethod<'TRowKey when 'TRowKey : equality> (frame :Frame<'TRowKey, string>) = // body

这与scrwtp称为“惯用方式”的方式相同(我不喜欢讨论同位论),但与此同时,它将作为扩展方法在C#中起作用。

如果要从F#和扩展名中使用它,则必须将其声明为类型:
[<Runtime.CompilerServices.Extension>]
type Extensions =
    [<Runtime.CompilerServices.Extension>]
    static member someMethod<'TRowKey when 'TRowKey : equality> (frame :Frame<'TRowKey, string>) = // body

因此,现在您可以键入row.,并且intellisense仅在扩展名的第二个参数是字符串时才会显示该扩展名。

10-08 01:56