Почему универсальная структура, параметризованная 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
Другие вопросы по тегам