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