我更喜欢将函数与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#中,length
和unit
函数是Vec2Module.length
和Vec2Module.unit
。的呸。
除了将函数定义为Vec2
的静态成员之外,还有什么解决方法?
更新
感谢您的回复,这是解决卡住Module
后缀限制的优秀解决方案。
我不想为每个以这种方式撰写的模块做出明确的声明,所以我只是坚持使用静态成员方法而不是let
- 模块中的绑定定义。
顺便说一句,我想知道是否已将此问题考虑在未来的C#版本中。例如在使用属性装饰类型,方法,属性等时,始终可以接受Attribute
后缀。在某些时候,Module
后缀可能会发生类似的事情吗?
答案 0 :(得分:5)
在C#6.0中,您可以access static members without specifying a type name。在你的情况下:
using static Vec2Module;
答案 1 :(得分:5)
您可以使用using
指令为该类创建本地别名:
using Vec2 = Vec2Module;