With the RequireQualifiedAccess
attribute, union cases must be referred to as MyUnion.MyCase
instead of just MyCase
. This prevents name collisions in the enclosing namespace or module:
type [<RequireQualifiedAccess>] Requirements =
None | Single | All
// Uses the DU with qualified access
let noRequirements = Requirements.None
// Here, None still refers to the standard F# option case
let getNothing () = None
// Compiler error unless All has been defined elsewhere
let invalid = All
If, for example, System
has been opened, Single
refers to System.Single
. There is no collision with the union case Requirements.Single
.