Sdílet prostřednictvím


Přetypování a převody typů (Průvodce programováním v C#)

Vzhledem k tomu, že jazyk C# je staticky zadán v době kompilace, není možné ji po deklaraci proměnné deklarovat znovu ani přiřadit hodnotu jiného typu, pokud tento typ není implicitně převoditelný na typ proměnné. string Například nelze implicitně převést na int. Proto poté, co deklarujete i jako int, nemůžete přiřadit řetězec "Hello" k němu, jak ukazuje následující kód.

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

Někdy ale budete muset zkopírovat hodnotu do proměnné nebo parametru metody jiného typu. Můžete mít například celočíselnou proměnnou, kterou potřebujete předat metodě, jejíž parametr je zadán jako double. Nebo možná budete muset přiřadit proměnnou třídy proměnné typu rozhraní. Tyto druhy operací se nazývají převody typů. V jazyce C# můžete provádět následující druhy převodů:

  • Implicitní převody: Nevyžaduje se žádná zvláštní syntaxe, protože převod vždy proběhne úspěšně a nedojde ke ztrátě dat. Mezi příklady patří převody z menších na větší integrální typy, převody z odvozených tříd na základní třídy a převody rozsahu.

  • Explicitní konverze (přetypování):Explicitní konverze vyžadují výraz typu přetypování. Přetypování je vyžadováno, pokud mohou být informace v převodu ztraceny nebo pokud převod nemusí být úspěšný z jiných důvodů. Mezi typické příklady patří číselný převod na typ, který má menší přesnost nebo menší rozsah, a převod instance základní třídy na odvozenou třídu.

  • Převody definované uživatelem: Převody definované uživatelem používají speciální metody, které můžete definovat, aby bylo možné povolit explicitní a implicitní převody mezi vlastními typy, které nemají relaci základní třídy odvozené od třídy. Další informace naleznete v tématu Uživatelem definované operátory převodu.

  • Převody s pomocnými třídami: K převodu mezi nekompatibilními typy, jako jsou celá čísla a System.DateTime objekty nebo šestnáctkové řetězce a bajtová pole, můžete použít System.BitConverter třídu, System.Convert třídu a Parse metody předdefinovaných číselných typů, například Int32.Parse. Další informace najdete v následujících článcích:

  • Jak převést bajtové pole na int

  • Jak převést řetězec na číslo

  • Jak převádět šestnáctkové řetězce na číselné typy a naopak

Implicitní převody

U předdefinovaných číselných typů lze implicitní převod provést, když se hodnota, která se má uložit, vejde do proměnné bez zkrácení nebo zaokrouhlení. U integrálních typů toto omezení znamená, že rozsah zdrojového typu je správnou podmnožinou rozsahu pro cílový typ. Například proměnná typu long (64bitové celé číslo) může ukládat libovolnou hodnotu, kterou může uložit int (32bitové celé číslo). V následujícím příkladu kompilátor implicitně převede hodnotu num vpravo na typ long před jeho přiřazením .bigNum

// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;

Úplný seznam všech implicitních číselných převodů najdete v části Implicitní číselné převody v článku Předdefinované číselné převody .

U referenčních typů implicitní převod vždy existuje z třídy na libovolnou z jejích přímých nebo nepřímých základních tříd nebo rozhraní. Není nutná žádná speciální syntaxe, protože odvozená třída vždy obsahuje všechny členy základní třídy.

Derived d = new Derived();

// Always OK.
Base b = d;

Explicitní převody

Pokud však převod nelze provést bez rizika ztráty informací, kompilátor vyžaduje, abyste provedli explicitní převod, který se nazývá přetypování. Přetypování je způsob, jak převod znázornit. Naznačuje, že jste si vědomi, že může dojít ke ztrátě dat, nebo že přetypování může selhat za běhu. Chcete-li provést přetypování, zadejte cílový typ v závorkách před výraz, který chcete převést. Následující program přetypuje double na int. Program se bez přetypování nesestaví.

double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234

Úplný seznam podporovaných explicitních číselných převodů najdete v části Explicitní číselné převody v článku Předdefinované číselné převody .

Pro referenční typy musíte použít explicitní přetypování, pokud potřebujete převést ze základního typu na odvozený typ.

Operace přetypování mezi odkazovými typy nemění typ běhu základního objektu; změní pouze typ hodnoty, která se používá jako odkaz na tento objekt. Další informace naleznete v tématu Polymorfismus.

Výjimky konverze typů během běhu programu

V některých převodech typu odkazu kompilátor nemůže určit, zda je přetypování platné. Je možné, že operace přetypování, která se správně zkompiluje, selže při běhu programu. Jak je znázorněno v následujícím příkladu, přetypování typu, které v době běhu selže, způsobí InvalidCastException vyvolání.

Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time

Explicitní přetypování argumentu a na Reptile představuje nebezpečný předpoklad. Je bezpečnější nedělat předpoklady, spíše zkontrolovat typ. Jazyk C# poskytuje operátor is, který vám umožní otestovat kompatibilitu před provedením přetypování. Další informace najdete v tématu Jak bezpečně přetypovat pomocí porovnávání vzorů a operátorů as a is.

Specifikace jazyka C#

Další informace najdete v části Převodyspecifikace jazyka C#.

Viz také