Литералы IntPtr и UIntPtr
Я пытался создать литерал для HWND_BROADCAST ((HWND)0xffff)
, который называется как IntPtr
,
let [<Literal>] HWND_BROADCAST = 0xFFFFn
Visual Studio сообщает мне: ошибка FS0267: это недопустимое константное выражение или значение пользовательского атрибута.
Отлично. Затем я проверил документацию по литералам F# на MSDN и заметил, что unativeint
(UIntPtr
) находится в списке. Я мог бы использовать это вместо IntPtr
, Но:
let [<Literal>] HWND_BROADCAST = 0xFFFFun
То же сообщение об ошибке.
Итак, у меня есть два вопроса:
- Почему
nativeint
литералы не поддерживаются? Есть ли причина этого? - Почему не
unativeint
буквальная работа, хотя MSDN говорит, что это должно?
Использование F# 3.1.2 (F# Interactive версия 12.0.30815.0) в Visual Studio 2013.
Я заметил bigint
также в списке, который тоже не работает. Так что я предполагаю, что просто MSDN ошибается.
1 ответ
Это две разные вещи: список содержит все поддерживаемые литеральные строки, но не все они могут быть помечены атрибутом Literal. Я думаю, что формулировка комментария под таблицей немного неудачна.
BigInt и IntPtr являются структурами, и это может быть причиной того, что они не могут быть объявлены как conts (я считаю, что это то, к чему сводится атрибут). Похоже, что это так и в C#, сравните здесь.
Я думаю, что это верно для IntPtr, но BigInt, вероятно, может быть обработан компилятором специально. Хотя полезность такого взлома может быть ограничена.