C# cast

Technique Risque d'exception Quand l'utiliser ?
(type)obj Oui Quand tu es sûr du type
as type Non Quand un cast peut échouer
is type x Non Pour tester et caster proprement
Conversion implicit/explicit Non / Oui Types numériques, types personnalisés
dynamic Runtime only Interop, scénarios dynamiques

Cast simple entre types numériques


int x = 10;
double d = x;          // conversion implicite
int y = (int)3.14;     // cast explicite
Console.WriteLine(y);  // 3
    

Cast d'un objet vers un type dérivé


object obj = "Hello";
string text = (string)obj;   // cast OK
Console.WriteLine(text);
    

Cast sécurisé avec as


object obj = "Hello";
string? s = obj as string;
if (s != null)
{
    Console.WriteLine("Cast réussi : " + s);
}
    

Test de type + cast (avec is)


object obj = 42;
if (obj is int n)
{
    Console.WriteLine($"C'est un int : {n}");
}
    

Cast dans une hiérarchie de classes (OOP)


class Animal { }
class Chien : Animal { }
Animal a = new Chien();
Chien c = (Chien)a; // cast explicite

Animal a = new Animal();
Chien c = (Chien)a; // InvalidCastException
    

Cast vers une interface


interface IVolant { void Voler(); }
class Oiseau : IVolant 
{
    public void Voler() => Console.WriteLine("Je vole !");
}
object obj = new Oiseau();
IVolant v = (IVolant)obj;  
v.Voler();
    

Cast entre types personnalisés via méthodes


public struct Temperature
{
    public double Celsius { get; }
    public Temperature(double celsius) => Celsius = celsius;

    public static explicit operator double(Temperature t) => t.Celsius;
    public static explicit operator Temperature(double v) => new Temperature(v);
}

Temperature t = new Temperature(25);
double c = (double)t;          // cast custom
Temperature t2 = (Temperature)30.5;
    

Cast dynamique via dynamic


dynamic d = "Hello";
int length = d.Length;   // cast dynamique à l'exécution
Console.WriteLine(length);
    

Cast avec LINQ (Cast<T>() et OfType<T>())


ArrayList items = new ArrayList { 1, 2, 3 };
// Cast forcé (exception si mauvais type)
var ints = items.Cast<int>();
// Cast filtré (ignore les mauvais types)
var safeInts = items.OfType<int>();
    

Exemple complet montrant différents types de cast


object obj = 123;

// 1. Cast explicite
int a = (int)obj;

// 2. Cast sécurisé
int? b = obj as int?;

// 3. Test + cast
if (obj is int c)
{
    Console.WriteLine(c);
}