Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az enumerálások, más néven enumerálások olyan integráltípusok, amelyekben a címkék az értékek egy részhalmazához vannak rendelve. Az olvashatóság és karbantarthatóság érdekében használhatók a literálok helyett.
Szemantika
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Megjegyzések
Az enumerálás úgy néz ki, mint egy diszkriminált egyesítés, amely egyszerű értékekkel rendelkezik, kivéve, hogy az értékek megadhatók. Az értékek általában 0-nál vagy 1-nél kezdődő egész számok, vagy bitpozíciókat képviselő egész számok. Ha az enumerálás bitpozíciók ábrázolására szolgál, használja a Flags attribútumot is.
Az enumerálás alapjául szolgáló típus a használt literálból van meghatározva, így például használhat konstansokat egy utótaggal, például 1u2u, stb. egy aláíratlan egész szám (uint32) típushoz.
Ha az elnevezett értékekre hivatkozik, magát az enumerálási típus nevét kell használnia minősítőként, enum-name.value1azaz nem csak value1. Ez a viselkedés eltér a diszkriminált szakszervezetek viselkedésétől. Ennek az az oka, hogy az enumerálások mindig a RequireQualifiedAccess attribútummal rendelkeznek.
Az alábbi kód egy enumerálás deklarációját és használatát mutatja be.
// Declaration of an enumeration.
type Color =
| Red = 0
| Green = 1
| Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red
Az enumerációkat egyszerűen konvertálhatja a mögöttes típusra a megfelelő operátor használatával, ahogyan az az alábbi kódban is látható.
// Conversion to an integral type.
let n = int col1
Az enumerált típusok a következő alapul szolgáló típusok egyikével rendelkezhetnek: sbyte, byte, int16, uint16, int32, uint32, int64, uint64és char. Az enumerációs típusok a .NET keretrendszerben olyan típusokként jelennek meg, amelyek a System.Enum-ből öröklődnek, és ez viszont a System.ValueType-ből öröklődik. Így ezek olyan értéktípusok, amelyek a veremen vagy a konténer objektumban találhatók, és az alapul szolgáló típus bármely értéke érvényes értéke a felsorolásnak. Ez az enumerálási értékek mintaegyeztetésekor jelentős, mivel olyan mintát kell megadnia, amely a névtelen értékeket fogja.
Az enum F#-kódtár függvénye enumerálási érték létrehozására használható, még az előre definiált, elnevezett értékek egyikétől eltérő érték létrehozására is. A függvényt az enum alábbiak szerint használhatja.
let col2 = enum<Color> (3)
Az alapértelmezett enum függvény a típussal int32működik. Ezért nem használható más mögöttes típusokkal rendelkező enumerálási típusok esetében. Ehelyett használja az alábbiakat.
type uColor =
| Red = 0u
| Green = 1u
| Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)
Emellett az enumerálási esetek mindig úgy lesznek kibocsátva, mint public. Így igazodnak a C# és a .NET-platform többi részéhez.
Ha csak a meghatározott enumerálási esetek teljes egyezését szeretné engedélyezni, az FS0104 figyelmeztetést az irányelv #nowarn "104"használatával tilthatja le. Ez lehetővé teszi, hogy a fordító csak a deklarált enumerálási értékeket kezelje érvényesként a mintaegyeztetés során, elkerülve a mindenre vonatkozó eset szükségességét – ez akkor hasznos, ha biztos benne, hogy az összes érték lefedve van.
Az FS0104 (Enums may take values outside known cases.) figyelmeztetés azért létezik, mert az enumerálások tetszőleges mögöttes értékekhez rendelhetők, például közvetlenül vagy bitenkénti műveletek eredményeként.