Почему универсальная структура, параметризованная blittable типом, не является неуправляемым типом?
У меня есть одна функция foo, которая принимает неуправляемый тип, затем я создаю общую структуру, которая требует, чтобы параметр типа был неуправляемым:
[<Struct>]
type Vector4<'T when 'T:unmanaged> =
val x : 'T
val y : 'T
val z : 'T
val w : 'T
new (x, y, z, w) = { x = x; y = y; z = z; w = w }
let foo<'T when 'T:unmanaged> (o:'T) =
printfn "%A" o
printfn "%d" sizeof<'T>
let bar() =
let o = Vector4<float32>(1.0f, 2.0f, 3.0f, 4.0f)
foo o // here has error
но я получил ошибку компиляции:
Error 4 A generic construct requires that the type 'Vector4<float32>' is an unmanaged type
Я проверил MSDN, это syas:
Предоставленный тип должен быть неуправляемым типом. Неуправляемые типы - это определенные примитивные типы (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64 или десятичные), типы перечисления, nativeptr<_>или не общая структура, все поля которой являются неуправляемыми типами.
Почему общая структура, для которой требуется параметр типа blittable, не является неуправляемым типом?
1 ответ
Общие типы не поддерживаются Interop: [1], [2]
Модель COM не поддерживает концепцию универсальных типов. Следовательно, универсальные типы нельзя использовать непосредственно для взаимодействия COM.
Тип псевдоним не поможет в этом случае, к сожалению:
[<Struct>]
[<StructLayout(LayoutKind.Sequential)>]
type Vector4<'T when 'T:unmanaged> =
val x : 'T
val y : 'T
val z : 'T
val w : 'T
new (x, y, z, w) = { x = x; y = y; z = z; w = w }
type Vector4float = Vector4<float32>
let inline foo<'T when 'T:unmanaged> (o:'T) =
printfn "%A" o
printfn "%d" sizeof<'T>
let bar() =
let o = new Vector4float(1.0f, 2.0f, 3.0f, 4.0f)
foo o // A generic construct requires that the type 'Vector4float' is an unmanaged type