Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Como o C# é tipado estaticamente em tempo de compilação, depois que uma variável é declarada, ela não pode ser declarada novamente ou atribuída a um valor de outro tipo, a menos que esse tipo seja implicitamente conversível para o tipo da variável. Por exemplo, o string
não pode ser convertido implicitamente em int
. Portanto, depois de declarar i
como um int
, você não pode atribuir a cadeia de caracteres "Olá" a ele, como mostra o código a seguir:
int i;
// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";
No entanto, às vezes você pode precisar copiar um valor em uma variável ou parâmetro de método de outro tipo. Por exemplo, você pode ter uma variável inteira que precisa passar para um método cujo parâmetro é digitado como double
. Ou talvez seja necessário atribuir uma variável de classe a uma variável de um tipo de interface. Esses tipos de operações são chamados de conversões de tipo. Em C#, você pode executar os seguintes tipos de conversões:
Conversões implícitas: Nenhuma sintaxe especial é necessária porque a conversão sempre é bem-sucedida e nenhum dado é perdido. Os exemplos incluem conversões de tipos integrais menores para maiores, conversões de classes derivadas para classes base e conversões de extensão.
Conversões explícitas (cast): conversões explícitas requerem uma expressão de conversão. A transmissão é necessária quando as informações podem ser perdidas na conversão ou quando a conversão pode não ser bem-sucedida por outros motivos. Exemplos típicos incluem conversão numérica para um tipo que tem menos precisão ou um intervalo menor e conversão de uma instância de classe base para uma classe derivada.
Conversões definidas pelo usuário: as conversões definidas pelo usuário usam métodos especiais que você pode definir para habilitar conversões explícitas e implícitas entre tipos personalizados que não têm uma relação de classe derivada da classe base. Para obter mais informações, consulte Operadores de conversão definidos pelo usuário.
Conversões com classes auxiliares: para converter entre tipos não compatíveis, como inteiros e System.DateTime objetos, ou cadeias de caracteres hexadecimais e matrizes de bytes, você pode usar a System.BitConverter classe, a System.Convert classe e os
Parse
métodos dos tipos numéricos internos, como Int32.Parse. Para obter mais informações, consulte os seguintes artigos:
Conversões implícitas
Para tipos numéricos internos, uma conversão implícita pode ser feita quando o valor a ser armazenado pode caber na variável sem ser truncado ou arredondado. Para tipos integrais, essa restrição significa que o intervalo do tipo de origem é um subconjunto adequado do intervalo para o tipo de destino. Por exemplo, uma variável do tipo long (inteiro de 64 bits) pode armazenar qualquer valor que um int (inteiro de 32 bits) possa armazenar. No exemplo a seguir, o compilador converte implicitamente o valor de num
à direita num tipo long
antes de atribuí-lo a bigNum
.
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Para obter uma lista completa de todas as conversões numéricas implícitas, consulte a seção Conversões numéricas implícitas do artigo Conversões numéricas internas .
Para tipos de referência, uma conversão implícita sempre existe de uma classe para qualquer uma de suas classes base diretas ou indiretas ou interfaces. Nenhuma sintaxe especial é necessária porque uma classe derivada sempre contém todos os membros de uma classe base.
Derived d = new Derived();
// Always OK.
Base b = d;
Conversões explícitas
No entanto, se uma conversão não puder ser feita sem o risco de perder informações, o compilador exige que você execute uma conversão explícita, que é chamada de cast. Um elenco é uma forma de fazer explicitamente a conversão. Isso indica que você está ciente de que a perda de dados pode ocorrer ou a transmissão pode falhar em tempo de execução. Para executar uma conversão, especifique o tipo de destino entre parênteses antes da expressão que você deseja converter. O programa a seguir converte um double para um int. O programa não compila sem a conversão.
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234
Para obter uma lista completa das conversões numéricas explícitas suportadas, consulte a seção Conversões numéricas explícitas do artigo Conversões numéricas internas .
Para tipos de referência, uma conversão explícita é necessária se você precisar converter de um tipo base para um tipo derivado:
Uma operação de conversão entre tipos de referência não altera o tipo de tempo de execução do objeto subjacente; altera apenas o tipo do valor que é usado como referência a esse objeto. Para obter mais informações, consulte Polimorfismo.
Exceções de conversão de tipo em tempo de execução
Em algumas conversões de tipo de referência, o compilador não pode determinar se uma conversão é válida. É possível que uma operação de conversão que compila corretamente falhe em tempo de execução. Como mostrado no exemplo a seguir, uma conversão de tipo que falha em tempo de execução faz com que um InvalidCastException seja lançado.
Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time
Lançar explicitamente o argumento a
para um Reptile
faz uma suposição perigosa. É mais seguro não fazer suposições, mas sim verificar o tipo. O C# fornece o operador is
para permitir o teste de compatibilidade antes de realizar efetivamente um cast. Para obter mais informações, consulte Como transmitir com segurança usando a correspondência de padrões e os operadores as e is.
Especificação da linguagem C#
Para obter mais informações, consulte a seção Conversões da especificação da linguagem C#.