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