Невозможно создать список литералов в 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 по умолчанию являются неизменяемыми.

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