Conversion

Conversion de nombre

Types numériques :

  • Entier : byte, int16, int/int32, int64

  • Flottant : float/double (64b), single (32b), decimal

  • Autres : char, enum

Conversion entre eux explicite → Fonction de même nom que le type cible

let x = 1               // val x : int = 1
let y = float x         // val y : float = 1.0
let z = decimal 1.2     // val z : decimal = 1.2M
let s = char 160        // val s : char = ' '

Conversion entre nombre et enum

Il faut utiliser le nom de l'enum pour convertir un nombre en enum :

  • Soit en paramètre générique de la fonction enum<my-enum>

  • Soit par annotation de type et la fonction enum sans paramètre générique ②

L'opération inverse utilise la fonction int

type Color =
    | Red   = 1
    | Green = 2
    | Blue  = 3

let color1 = enum<Color> 1      // (1)  val color1 : Color = Red
let color2 : Color = enum 2     // (2)  val color2 : Color = Green
let value3 = int Color.Blue     // (3)  val c1 : int = 3

Casting d'objets

→ S'utilise pour un objet dont le type appartient à une hiérarchie

Fonctionnalité
Précision
Sûr
Opérateur
Fonction

Upcast

Vers type de base

✅ Oui

:>

upcast

Downcast

Vers type dérivé

❌ Non (*)

:?>

downcast

Test de type

Dans pattern matching

✅ Oui

:?

(*) Le downcast peut échouer → risque de InvalidCastException au runtime ⚠️

Upcasting d'objets

En C♯ : upcast peut généralement être implicite

En F♯ : upcast peut parfois être implicite mais en général doit être explicite, avec opérateur :>

☝️ Règles élargies/assouplies en F♯ 6 → Exemple : upcast implicite de int list vers int seq

Casting d'objets - Exemple

Test de type

L'opérateur :? réalise un test de type et renvoie un booléen.

☝️ Il faut boxer un nombre pour tester son type :

💡 box xx :> obj

Mis à jour

Ce contenu vous a-t-il été utile ?