Sobes.tech
Junior

Aké typy konverzií existujú v C#?

sobes.tech AI

Odpoveď od AI

V jazyku C# existujú dva hlavné typy prevodu:

  1. Explicitný prevod (Explicit conversion): Vyžaduje použitie operátora (typ). Používa sa, keď kompilátor nemôže bezpečne vykonať konverziu automaticky, napríklad pri prevode z základnej triedy na odvodenú alebo z typu s väčšou presnosťou na typ s menšou (napríklad double na int). Môže viesť ku strate dát alebo chybe počas behu (InvalidCastException).

    // Explicitný prevod double na int
    double d = 123.45;
    int i = (int)d; // i bude 123
    
    // Explicitný prevod objektu na konkrétny typ
    object obj = "Hello";
    string s = (string)obj; // s bude "Hello"
    
  2. Implicitný prevod (Implicit conversion): Automaticky sa vykonáva kompilátorom, keď je prevod známy a bezpečný, teda bez straty dát. Napríklad prevod z int na double.

    // Implicitný prevod int na double
    int x = 10;
    double y = x; // y bude 10.0
    
    // Implicitný prevod odvodeného triedy na základnú
    class Base {}
    class Derived : Base {}
    
    Derived derivedObj = new Derived();
    Base baseObj = derivedObj; // Implicitný prevod
    

Okrem toho existujú operátory as a is, ktoré tiež patria k prevodu typov, ale s vlastnými špecifikami:

  • Operátor as: Vykonáva prevod typu, ak je to možné, a vracia null, ak sa prevod nepodarí. Nevyvoláva výnimku InvalidCastException. Používa sa iba pre referenčné typy a typy umožňujúce Nullable.

    // Použitie operátora as
    object obj2 = "World";
    string s2 = obj2 as string; // s2 bude "World"
    
    object obj3 = 123;
    string s3 = obj3 as string; // s3 bude null
    
  • Operátor is: Kontroluje, či je objekt inštanciou určitého typu alebo jeho odvodeného typu. Vráti true alebo false. V najnovších verziách C# sa môže použiť s pattern matching na súčasnú kontrolu a prevod.

    // Použitie operátora is na kontrolu typu
    object obj4 = "Example";
    if (obj4 is string)
    {
        // Akcie, ak je objekt reťazec
    }
    
    // Použitie is s patternom (pattern matching)
    if (obj4 is string str)
    {
        // str je dostupný ako reťazec
    }