Подтвердить что ты не робот

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

В С# можно определить константу члена типа следующим образом:

class Foo { public const int Bar = 600; }

ИЛ выглядит так.

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

Как я могу сделать то же самое в Visual F #/FSharp?

Я пробовал это безрезультатно:

[<Sealed>]
 type Foo() =

    [<Literal>]
    let Bar = 600
4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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