Ответ 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, потому что никто не может его получить.