2014-10-30 2 views
1

Я пробовал создать литерал для HWND_BROADCAST ((HWND)0xffff), который сортируется как IntPtr.Литералы IntPtr и UIntPtr

let [<Literal>] HWND_BROADCAST = 0xFFFFn 

Visual Studio говорит мне: ошибка FS0267: Это не является допустимым постоянным выражением или пользовательские значения атрибута.

Очень хорошо. Затем я проверил documentation on F# Literals on 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 - это структуры, и, возможно, поэтому они не могут быть объявлены как const (я считаю, что это то, к чему атрибут сводится). Похоже, что это так и в C#, сравните here.

Я думаю, что точка имеет место для IntPtr, но BigInt, вероятно, может быть обработана специально компилятором. Хотя полезность такого взлома может быть ограничена.

+0

Я вроде как понимаю. Но, тем не менее, это очень противоречиво, потому что тогда, очевидно, в списке отсутствует литеральное значение для 'nativeint'. –

+0

Ах, правда, никогда не замечал этого. – scrwtp

 Смежные вопросы

  • Нет связанных вопросов^_^