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

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#)

explicit (odwołanie w C#)

implicit (odwołanie w C#)

Operatory konwersji (Przewodnik programowania w języku C#)

Koncepcje

Przewodnik programowania w języku C#

Konwersja uogólnionych typów

Konwersja typu wyeksportowanego