在没有丑陋"模块"的情况下从C#调用F#函数后缀

时间:2018-06-17 18:57:50

标签: c# module f# interop

我更喜欢将函数与F#的惯用语言分开:

[<Struct>]
type Vec2 =
    {
        x   : single
        y   : single
    }

    static member inline (/) (v, scalar) =
        let s = single scalar in { x = v.x / s; y = v.y / s }

[<CompilationRepresentation (CompilationRepresentationFlags.ModuleSuffix)>]
module Vec2 =
    let inline length v = ((pown v.x 2) + (pown v.y 2)) |> sqrt

    let unit v = let l = length v in { x = v.x / l; y = v.y / l }

不幸的是,在C#中,lengthunit函数是Vec2Module.lengthVec2Module.unit。的呸。

除了将函数定义为Vec2的静态成员之外,还有什么解决方法?

更新

感谢您的回复,这是解决卡住Module后缀限制的优秀解决方案。

我不想为每个以这种方式撰写的模块做出明确的声明,所以我只是坚持使用静态成员方法而不是let - 模块中的绑定定义。

顺便说一句,我想知道是否已将此问题考虑在未来的C#版本中。例如在使用属性装饰类型,方法,属性等时,始终可以接受Attribute后缀。在某些时候,Module后缀可能会发生类似的事情吗?

2 个答案:

答案 0 :(得分:5)

在C#6.0中,您可以access static members without specifying a type name。在你的情况下:

using static Vec2Module;

答案 1 :(得分:5)

您可以使用using指令为该类创建本地别名:

using Vec2 = Vec2Module;