F # поддерживает ограничение типа для "неуправляемого". Это не то же самое, что ограничение типа значения, такое как ограничения структуры. MSDN отмечает, что поведение неуправляемого ограничения:
Предоставляемый тип должен быть неуправляемым. Неуправляемые типы - это либо определенные примитивные типы (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64 или decimal), типы перечисления, nativeptr < _ > или не общая структура, поля которой являются неуправляемыми типами.
Это очень удобный тип ограничения при вызове платформы, и не раз я хотел бы, чтобы у С# был способ сделать это. С# не имеет этого ограничения. С# не поддерживает все ограничения, которые могут быть указаны в CIL. Примером этого является перечисление. В С# вы не можете этого сделать:
public void Foo<T>(T bar) where T:enum
Однако компилятор С# соблюдает ограничение "enum", если оно встречается с ним в другой библиотеке. Jon Skeet может использовать это для создания своего проекта Unconstrained Melody.
Итак, мой вопрос заключается в том, что F # "неуправляемое" ограничение означает что-то, что может быть представлено в CIL, как ограничение перечисления и просто не показано на С#, или оно принудительно выполняется компилятором F #, как и некоторые другие ограничения F # поддерживает (например, явное ограничение Member)?