Литералы 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

То же сообщение об ошибке.

Итак, у меня есть два вопроса:

  1. Почему nativeint литералы не поддерживаются? Есть ли причина этого?
  2. Почему не 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, вероятно, может быть обработан компилятором специально. Хотя полезность такого взлома может быть ограничена.

Другие вопросы по тегам