Sobes.tech
Junior

Aké druhy konverzie typov existujú v C#?

sobes.tech AI

Odpoveď od AI

V jazyku C# existujú dva hlavné spôsoby prevodu typov: explicitný a implicitný.

Implicitný prevod

Prebieha automaticky, keď prekladač je presvedčený, že prevod je bezpečný a nezpôsobí stratu údajov. Napríklad z typu s menším rozsahom hodnôt na typ s väčším.

// Implicitný prevod int na long
int i = 100;
long l = i;

Explicitný prevod

Vyžaduje uvedenie operátora prevodu ((typ)) v kóde a používa sa, keď prevod môže viesť ku strate údajov alebo vyvolať výnimku. Je potrebný pri prevode z typu s väčším rozsahom hodnôt na typ s menším alebo medzi nesúvisiacimi typmi.

// Explicitný prevod double na int
double d = 123.45;
int i = (int)d; // Zlomková časť je zahodená

// Explicitný prevod object na string
object obj = "Hello";
string s = (string)obj;

// Použitie operátorov as a is
object objAs = "World";
string sAs = objAs as string; // vráti null, ak prevod nie je možný
if (objAs is string) // Kontroluje, či je objekt typu string
{
    string sIs = (string)objAs;
}

Porovnanie explicitného prevodu, as a is

Operácia Popis Chyba pri neúspechu
(Typ) výraz Explicitný prevod. Vyžaduje presnú zhodu typu. InvalidCastException
výraz as Typ Pokúša sa previesť typ. Funguje iba pre referenčné typy a typy, ktoré umožňujú null. vráti null
výraz is Typ Kontroluje, či je možné výraz previesť na daný typ. Boolean hodnota (true/false)

Používateľské prevody

Vývojár môže definovať vlastné explicitné a implicitné operátory prevodu pre vlastné typy pomocou kľúčových slov implicit a explicit.

// Príklad používateľského implicitného prevodu
public class Inches
{
    public int Value { get; set; }
    public static implicit operator Millimeters(Inches i)
    {
        return new Millimeters { Value = i.Value * 25 };
    }
}

public class Millimeters
{
    public int Value { get; set; }
}

// Použitie
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Implicitný prevod
// Príklad používateľského explicitného prevodu
public class Kilograms
{
    public int Value { get; set; }
}

public class Pounds
{
    public int Value { get; set; }
    public static explicit operator Kilograms(Pounds p)
    {
        return new Kilograms { Value = (int)(p.Value / 2.20462) };
    }
}

// Použitie
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Explicitný prevod