Junior
Jaké druhy převodu typů existují v C#?
sobes.tech AI
Odpověď od AI
V jazyce C# existují dva hlavní způsoby převodu typů: explicitní a implicitní.
Implicitní převod
Probíhá automaticky, když překladač je přesvědčen, že převod je bezpečný a nezpůsobí ztrátu dat. Například z typu s menším rozsahem hodnot do typu s větším.
// Implicitní převod int na long
int i = 100;
long l = i;
Explicitní převod
Vyžaduje v kódu uvedení operátoru převodu ((typ)) a používá se, když převod může vést ke ztrátě dat nebo vyvolat výjimku. Je nutný při převodu z typu s větším rozsahem hodnot na typ s menším nebo mezi nesouvisejícími typy.
// Explicitní převod double na int
double d = 123.45;
int i = (int)d; // Zlomková část je zahozena
// Explicitní převod object na string
object obj = "Hello";
string s = (string)obj;
// Převod pomocí operátorů as a is
object objAs = "World";
string sAs = objAs as string; // Vrací null, pokud převod není možný
if (objAs is string) // Kontroluje, zda je objekt typu string
{
string sIs = (string)objAs;
}
Porovnání explicitního převodu, as a is
| Operace | Popis | Chyba při neúspěchu |
|---|---|---|
(Typ) výraz |
Explicitní převod. Vyžaduje přesné shodě typu. | InvalidCastException |
výraz as Typ |
Pokusí se převést typ. Funguje pouze pro referenční typy a typy umožňující null. | Vrací null |
výraz is Typ |
Kontroluje, zda lze výraz převést na daný typ. | Boolean hodnota (true/false) |
Uživatelské převody
Vývojář může definovat vlastní explicitní a implicitní operátory převodu pro vlastní typy pomocí klíčových slov implicit a explicit.
// Příklad vlastního implicitního převodu
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žití
Inches inches = new Inches { Value = 10 };
Millimeters mm = inches; // Implicitní převod
// Příklad vlastního explicitního převodu
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žití
Pounds pounds = new Pounds { Value = 100 };
Kilograms kg = (Kilograms)pounds; // Explicitní převod