У меня есть функция, которая преобразует из моей собственной реализации трехмерного вектора (который поддерживает единицы измерения) в реализацию 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<1> -> Microsoft.Xna.Framework.Vector3, что делает его совершенно непригодным для использования.Я не уверен, что это связанная проблема.