Rzutowanie i konwersje typów (Przewodnik programowania w języku C#)
C# jest wpisany statycznie w czasie kompilacji, po zadeklarowaniu zmiennej, dlatego nie można ponownie zadeklarowana lub używane do przechowywania wartości innego typu, chyba że tego typu jest wymienialna do zmiennej typu.Na przykład jest bez konwersji z typu integer wszelkich dowolny ciąg znaków.Dlatego po deklarowaniu i nie jako liczba całkowita, można przypisać ciąg znaków "Hello", jak to pokazano w poniższym kodzie.
int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
Jednak czasami może być konieczne skopiowanie wartość do zmiennej lub metody parametr innego typu.Na przykład, może być zmienna typu Liczba całkowita, który trzeba przekazać do metody, których parametr jest wpisana jako double.Lub należy przypisać zmiennej klasy do zmiennej typu interfejsu.Te rodzaje operacji są nazywane Konwersje typów.W języku C# można wykonywać następujące typy konwersji:
Konwersje niejawne: nie specjalnej składni jest wymagane, ponieważ konwersja jest typu bezpiecznej i dane nie zostaną utracone.Przykładami konwersje z mniejszych na większe typy integralną i konwersje z klas pochodnych oparcie klas.
Konwersje jawne (poświaty): Konwersje jawne wymagają operatorze rzutowania.Rzutowanie jest wymaganych informacji może zostać utracone w wyniku konwersji lub podczas konwersji może się nie powieść z innych przyczyn. Typowe przykłady to numerycznej konwersji na typ, który ma mniej precyzji lub mniejszy zakres i konwersję instancji klasy base do klasy pochodnej.
Konwersje zdefiniowane przez użytkownika: konwersje zdefiniowane przez użytkownika są wykonywane przez specjalne metody, które można zdefiniować, aby umożliwić jawne i niejawne konwersje między typy niestandardowe, które nie mają relacji klasy podstawowej class–derived.Aby uzyskać więcej informacji, zobacz Operatory konwersji (Przewodnik programowania w języku C#).
Konwersje z klasy pomocy: do konwersji między niezgodnych typów, takie jak liczby całkowite i DateTime obiektów, lub szesnastkowym ciągi i tablice bajtów, można użyć BitConverter klasy, Convert klasy oraz Parse metody numeryczne wbudowanych typów, takich jak Int32.Parse.Aby uzyskać więcej informacji, zobacz Porady: konwertowanie tablicy typu Byte na liczbę całkowitą (Przewodnik programowania w języku C#), Porady: konwertowanie ciągu na liczbę (Przewodnik programowania w języku C#), i Porady: konwertowanie ciągów szestnastkowych na typy liczbowe (Przewodnik programowania w języku C#).
Konwersje niejawne
Wbudowane typy liczbowe niejawna konwersja może być dokonywane, jeżeli wartości, które mają być przechowywane można umieścić w zmiennej bez są obcinane lub zaokrąglone.Na przykład zmienna typu long (liczba całkowita 8 bajtów) można przechowywać dowolną wartość, która int (4 bajty na komputerze 32-bitowym) można przechowywać.W poniższym przykładzie kompilator niejawnie konwertuje wartość na prawo do typu long przed przypisaniem go do bigNum.
// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Aby uzyskać pełną listę wszystkich konwersje numeryczne, zobacz Tabela niejawnych konwersji liczbowych (odwołanie w C#).
Dla typu odwołania niejawna konwersja zawsze istnieje od klasy do jednej z jej klas podstawowych bezpośredniego lub pośredniego lub interfejsów.Nie specjalnej składni jest konieczne, ponieważ klasy pochodnej zawsze zawiera wszystkich członków klasy podstawowej.
Derived d = new Derived();
Base b = d; // Always OK.
Konwersje jawne
Jednakże, jeśli konwersja nie jest możliwe bez ryzyka utraty informacji, kompilator wymaga wykonania konwersja jawna, która nosi nazwę oddanych.Rzutowanie sposób jawnie informowania kompilator zamierzają wprowadzić konwersji i że są świadomi, że może dojść do utraty danych.Aby wykonać rzutowania, należy określić typ, który są rzutowanie w nawiasach z przodu wartość lub zmienna do konwersji.Następujący program poświaty double do int.Program nie zostanie skompilowany bez rzutowania.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Aby uzyskać listę jawne konwersje numerycznych, które są dozwolone, zobacz Tabela jawnych konwersji liczbowych (odwołanie w C#).
Dla typu odwołania do jawnego cast jest wymagana, jeśli wymagana jest konwersja z typu podstawowego typu pochodnego:
// 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;
Operacja cast między typy odwołań nie zmienia typu run-time obiektu źródłowego; zmienia tylko typ wartości, który jest używany jako odwołanie do tego obiektu.Aby uzyskać więcej informacji, zobacz Polimorfizm (Przewodnik programowania w języku C#).
Typ konwersji wyjątki w czasie wykonywania
W niektórych konwersje typów odniesienia kompilator nie może określić, czy rzutowania będą obowiązywać.Jest możliwe dla operacji oddanych który poprawnie kompiluje się niepowodzeniem w czasie wykonywania.Jak pokazano w poniższym przykładzie, rzutowanie typu spowoduje błąd w czasie wykonywania InvalidCastException do zostać wygenerowany.
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# zawiera jest i jako podmiotom gospodarczym umożliwiają badanie zgodności przed wykonaniem faktycznie rzutowania.Aby uzyskać więcej informacji, zobacz Porady: bezpieczne rzutowanie za pomocą operatorów as i is (Przewodnik programowania w języku C#).
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.
Promowane rozdziału książki.
Więcej informacji na temat zmiennych w początku Visual C# 2010
Zobacz też
Zadania
Porady: konwertowanie ciągu na liczbę (Przewodnik programowania w języku C#)
Informacje
Typy (Przewodnik programowania w języku C#)
() — Operator (odwołanie w C#)
Operatory konwersji (Przewodnik programowania w języku C#)