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);
}