How to define type member constant in F#?

天大地大妈咪最大 提交于 2019-12-19 13:57:12

问题


In C# one can define a type member constant like this:

class Foo { public const int Bar = 600; }

The IL looks like this.

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

How can I do the same within Visual F# / FSharp?

I tried this to no avail:

[<Sealed>]
 type Foo() =

    [<Literal>]
    let Bar = 600

回答1:


I did a couple of experiments with the F# compiler and here are some my observations. If you want to create IL literal, then you need to place the value marked as a Literal inside a module. For example like this:

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

As a side-note, I did a quick search through the F# specification and it seems that literals can be very useful for pattern matching, because you can use them as a pattern (as long as they start with an uppercase letter):

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

Now, the question is, why Literal doesn't behave as you would expect when you place it inside a type declaration. I think the reason is that let declaration inside an F# type declaration cannot be public and will be visible only inside the class/type. I believe that both C# and F# inline literal values when you use them and this is done inside type declarations too. However since the literal cannot be public, there is no reason for generating the literal IL field, because nobody could ever access it.




回答2:


I'm not sure that this is possible. In fact, I don't even think that you can create immutable public fields, not to mention constants.



来源:https://stackoverflow.com/questions/2399917/how-to-define-type-member-constant-in-f

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!