TL; DR: il compilatore F # interpreta int
in questo contesto come il int
operator, come determined by Eugene Fotin e expanded upon by Gene Belitski. La soluzione migliore è utilizzare System.Int32.MaxValue
o un alias di tipo univoco come descritto di seguito.F # int.MaxValue è "non un'espressione costante valida", ma System.Int32.MaxValue è?
Si consideri il seguente tipo di record:
type User = {
Username : string
}
voglio Username
essere almeno tre caratteri, in modo da utilizzare l'attributo StringLength
. Non esiste una durata massima, quindi ho impostato a int.MaxValue
:
type User = {
[<StringLength(int.MaxValue, MinimumLength=3)>]
Username : string
}
Questo mi dà il seguente errore:
This is not a valid constant expression or custom attribute value.
Tutto è peachy se uso System.Int32
invece:
type User = {
[<StringLength(System.Int32.MaxValue, MinimumLength=3)>]
Username : string
}
Compilare anche se io alias int
:
type User = {
[<StringLength(num.MaxValue, MinimumLength=3)>]
Username : string
}
and num = int
o completamente qualificare il tipo:
type User = {
[<StringLength(Microsoft.FSharp.Core.int.MaxValue, MinimumLength=3)>]
Username : string
}
ho controllato la fonte # F e int
is defined exactly as you would expect:
type int32 = System.Int32
// Then, a few lines later…
type int = int32
Cosa sta succedendo? Supponevo che i tipi primitivi F # fossero intercambiabili con altri tipi nella maggior parte dei contesti, ma sembra che manchi qualcosa dal mio modello mentale.
Hai ragione, ecco cosa sta succedendo. Mi chiedo perché sia così? Qualcosa nella grammatica F #, immagino? –