Rei*_*aka 1 f# units-of-measurement type-extension
我有一个函数,可以从我自己的3D矢量(支持度量单位)实现转换为XNA的实现:
type Vector3<[<Measure>]'a> with
member inline v.ToXna() =
Microsoft.Xna.Framework.Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)
Run Code Online (Sandbox Code Playgroud)
当我编译它时,我得到一个奇怪的错误:
签名和实现不兼容,因为类/签名中的type参数与成员/实现中的类型参数具有不同的编译时要求
这inline似乎是必要的; 没有它,我收到此错误:
此构造使代码不如类型注释所指示的那样通用.度量单位变量'a已被约束为度量'm'.
知道发生了什么事吗?
编辑要回答@ svick的问题,Vector3定义为:
type Vector3<[<Measure>]'u> =
struct
val x:float32<'u>
val y:float32<'u>
val z:float32<'u>
new(x, y, z) = { x = x; y = y; z = z }
end
Run Code Online (Sandbox Code Playgroud)
我也有一些类型推断问题,将其定义为正常函数:
let vector3 (v:DumpEngine.Vector3<_>) =
Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)
Run Code Online (Sandbox Code Playgroud)
导致该函数为Vector3 <1> - > Microsoft.Xna.Framework.Vector3,这使得它非常不可用.不过,我不确定这是一个相关的问题.
另一个解决方案,通过使用强制转换而不是分割来完全解决问题:
type Vector3<[<Measure>]'u> with
member inline v.ToXna() =
Microsoft.Xna.Framework.Vector3(float32 v.x, float32 v.y, float32 v.z)
Run Code Online (Sandbox Code Playgroud)