Как определить участника типа, постоянного в F#?

В C# можно определить участника типа, постоянного как это:

class Foo { public const int Bar = 600; }

IL похож на это.

.field public static literal int32 Bar = int32(600)

Как я могу сделать то же в Визуальном F# / Фа-диез?

Я попробовал это напрасно:

[<Sealed>]
 type Foo() =

    [<Literal>]
    let Bar = 600
19
задан Joel Mueller 8 March 2010 в 18:43
поделиться

2 ответа

Я провел пару экспериментов с компилятором F# и вот некоторые мои наблюдения. Если вы хотите создать IL литерал, то вам нужно поместить значение, помеченное как Литерал, внутрь модуля. Например, вот так:

module Constants = 
  [<Literal>]
  let Num = 1

В качестве примечания, я провел быстрый поиск в спецификации F# и, похоже, что литералы могут быть очень полезны для сопоставления шаблонов, потому что вы можете использовать их в качестве шаблона (если они начинаются с заглавной буквы):

open Constants
match 1 with
| Num -> "1"
| _ -> "other"

Теперь вопрос в том, почему Literal не ведет себя так, как вы ожидаете, когда помещаете его внутрь объявления типа. Я думаю, причина в том, что объявление let внутри объявления типа в F# не может быть public и будет видно только внутри класса/типа. Я полагаю, что и C#, и F# инлайнят литеральные значения, когда вы их используете, и это также делается внутри объявлений типов. Однако, поскольку литерал не может быть публичным, нет причин для генерации поля literal IL, потому что никто никогда не сможет получить к нему доступ.

20
ответ дан 30 November 2019 в 04:48
поделиться

Я не уверен, что это возможно. На самом деле, я даже не думаю, что вы можете создать неизменяемые публичные поля, не говоря уже о константах.

0
ответ дан 30 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: