我有一个函数可以将我自己的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<_>)
当我编译它时,我得到一个奇怪的错误:
签名和实现不兼容,因为类型 类/签名中的参数具有不同的编译时 要求成员/实施中的那个
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
我也有一些类型推断问题,将其定义为正常函数:
let vector3 (v:DumpEngine.Vector3<_>) =
Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)
使该函数成为Vector3&lt; 1&gt; - &GT; Microsoft.Xna.Framework.Vector3,使其无法使用。不过,我不确定这是一个相关的问题。
答案 0 :(得分:6)
另一种解决方案,它完全通过使用演员而不是分裂来解决问题:
type Vector3<[<Measure>]'u> with
member inline v.ToXna() =
Microsoft.Xna.Framework.Vector3(float32 v.x, float32 v.y, float32 v.z)
答案 1 :(得分:1)
我不知道发生了什么,但这似乎有效:
let inline ToXna(v:Vector3<'a>) =
Microsoft.Xna.Framework.Vector3(v.x / 1.f<_>, v.y / 1.f<_>, v.z / 1.f<_>)
这是我设法做到的最好的事情。