Невозможно создать список литералов в F#
У меня есть следующие типы
type StatusCode =
| OK = 200
| NoContent = 204
| MovedTemp = 301
| MovedPerm = 302
| SeeOther = 303
| NotModified = 304
| NotFound = 404
| ServerError = 500
[<Literal>]
let NoBodyAllowedStatusCodes = [StatusCode.NoContent; StatusCode.NotModified]
И я получаю ошибку во время компиляции, которая говорит:
Это недопустимое константное выражение или значение пользовательского атрибута
Я не могу понять, что здесь не так.
1 ответ
В F# и.NET в целом списки не могут быть литералами (постоянными в C#/VB.NET). Только примитивные значения могут, как string
, bool
и т. д. Спецификация F# 3.0 содержит указания относительно того, что может или не может быть литералом в разделе 10.2.2:
Значение, имеющее атрибут Literal, подчиняется следующим ограничениям:
- Он не может быть помечен как изменяемый или встроенный.
- Он также может не иметь атрибутов ThreadStatic или ContextStatic.
- Правое выражение должно быть буквальным константным выражением, которое состоит из:
- Простое константное выражение, за исключением (), собственных целочисленных литералов, беззнаковых собственных целочисленных литералов, литералов байтового массива, литералов BigInteger и пользовательских числовых литералов.
-ИЛИ ЖЕ-
- Ссылка на другой литерал.
В зависимости от того, что вы пытаетесь сделать, вы можете сделать свой список статическим, если let
привязка используется в классе. Если это в модуле, я бы просто удалил Literal
атрибут, поскольку привязки let по умолчанию являются неизменяемыми.