Obsazení a převody typu (Příručka programování C#)
C# je staticky zadávané v době kompilace po je proměnná deklarována, nelze znovu deklarována nebo použít k uložení hodnoty jiného typu, pokud je převést na typ proměnné typu.Například je celé číslo bez převodu na libovolný řetězec.Proto po deklarujete i jako celé číslo nelze přiřadit řetězec "Hello", jak ukazuje následující kód.
int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
Však může být někdy nutné zkopírovat do jiného typu parametru proměnnou nebo metodu hodnotu.Může mít například proměnná typu integer, které chcete předat do metody zadané jako parametr, jehož double.Nebo je třeba přiřadit proměnné třídy proměnné typu rozhraní.Tyto druhy operací se nazývají převody typu.V jazyce C# můžete provést následující typy převodů:
Implicitní převody: žádné zvláštní syntaxe není nutná, protože převod je typ bezpečné a žádná data budou ztracena.Příklady zahrnují převody z menších větší typy nedílnou a převody z založit tříd odvozených tříd.
Explicitní převody (nádech): explicitní převody vyžadují operátoru přetypování.Obsazení je vyžadován při převodu dojít ke ztrátě informací nebo při převodu nemusí proběhnout úspěšně jiných důvodů. Typické příklady převodu číselného typu, který má menší přesnost nebo menší rozsah a převod instanci třídy base odvozené třídy.
Uživatelem definované převody: uživatelem definovaný převod provádí zvláštní metody, které můžete definovat explicitní a implicitní převody mezi vlastní typy, které nemají vztah třídy základní class–derived povolit.Další informace naleznete v tématu Operátory převodu (Příručka programování C#).
Převody pomocné třídy: K převodu mezi typy nekompatibilní, jako celá čísla a System.DateTime objekty, nebo šestnáctkové řetězce a Bajtová pole můžete použít System.BitConverter třídy, System.Convert třídy a Parse metody předdefinované číselné typy, jako například Int32.Parse.Další informace naleznete v tématu Jak: převést byte Array int (C# program televize), Jak: převést řetězec na int (C# program televize) a Jak: převod mezi šestnáctkové řetězce a číselné typy (Příručka programování C#).
Implicitní převody
Předdefinované číselné typy implicitní převod lze provést, když hodnoty uložené vejde do proměnné bez zkrácen nebo zaokrouhlena.Například proměnná typu dlouhé (celé číslo 8 bajtů) lze uložit libovolné hodnoty, int (4 bajty 32bitové počítače) můžete uložit.V následujícím příkladu kompilátor implicitně převede hodnotu na pravé straně typu long před přiřazením k bigNum.
// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Úplný seznam všech implicitní převody číselný, viz Implicitní číselné tabulky převody (C#-Reference).
Pro referenční typy existuje vždy implicitní převod z třídy k žádné rozhraní nebo přímé nebo nepřímé základní třídy.Žádné speciální syntaxi je nezbytné, protože odvozené třídy vždy obsahuje členy základní třídy.
Derived d = new Derived();
Base b = d; // Always OK.
Explicitní převody
Však pokud převod nelze bez rizika ztráty informací, kompilátor vyžaduje provést explicitní převod, nazývá cast.Osazení způsobem explicitně informování kompilátor úmyslu provést převod a že jste si vědomi, že může dojít ke ztrátě dat.Provést osazení zadejte typ, který se obsazení do v závorkách u hodnota nebo proměnná převést.Následující program nádech dvojité k int.Program nebude kompilován bez tavby.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Seznam číselných explicitní převody, které jsou povoleny, viz Explicitní číselné tabulky převody (C#-Reference).
Pro referenční typy explicitní cast je vyžadován, pokud potřebujete převést základní typ odvozený typ:
// Create a new derived type.
Giraffe g = new Giraffe();
// Implicit conversion to base type is safe.
Animal a = g;
// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe) a;
Osazení operace mezi typy odkazů nemění typ spuštění základní objekt; změní pouze typ hodnoty, který slouží jako odkaz na objekt.Další informace naleznete v tématu Polymorfismus (Příručka programování C#).
Typ převodu výjimky v době spuštění
Kompilátor v některé převody typu odkaz, nelze určit zda bude platné osazení.Je možné pro osazení operaci, která sestaví správně k chybě za běhu.Jak ukazuje následující příklad, typ nádech, že dojde k chybě za běhu způsobí, že InvalidCastException se vyvolá.
class Animal
{
public void Eat() { Console.WriteLine("Eating."); }
public override string ToString()
{
return "I am an animal.";
}
}
class Reptile : Animal { }
class Mammal : Animal { }
class UnSafeCast
{
static void Main()
{
Test(new Mammal());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
static void Test(Animal a)
{
// Cause InvalidCastException at run time
// because Mammal is not convertible to Reptile.
Reptile r = (Reptile)a;
}
}
C# obsahuje je a jako operátorů, umožňuje testování kompatibility před jeho skutečným provedením osazení.Další informace naleznete v tématu Jak: bezpečně jako pomocí nádechu a operátoři (C# program televize).
Specifikace jazyka C#
Další informace naleznete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.
Kapitola hlavní knihy
Další informace o proměnných v začátek Visual C# 2010
Viz také
Úkoly
Jak: převést řetězec na int (C# program televize)
Referenční dokumentace
Typy (Příručka programování C#)
Operátory převodu (Příručka programování C#)