特别是,我想为这种类型编写扩展方法:
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仅在扩展名的第二个参数是字符串时才会显示该扩展名。