简体   繁体   中英

How to define type member constant in F#?

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

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM