Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Casting implícito
  2. Sinalização no casting
  3. Casting explícito
  4. Boxing/unbox
  5. Casting com as
  6. Perda de dados no casting
  7. Diferença entre () e as

A linguagem C#, assim como várias outras linguagens, nos permite realizar a conversão(casting) dos tipos de dados primitivos em outros. Nesta parte do tutorial vamos ver o casting implícito e explícito, box/unbox e outros.

A checagem de tipo de dados de uma variável pode ser feita utilizando o operador (is) que foi visto em C#: Variáveis.

No casting implícito, sem perda de dados, a linguagem C# atribui automaticamente um tipo de dado de menor capacidade de armazenamento para uma tipo de dado maior capacidade.

Sintaxe
ulong < uint < ushort < byte
Onde
<: Sentido do casting. 
Exemplo 1
byte _byte = 0xff; //1 byte
ushort valor = _byte; //2 bytes
Saída
-

Para o casting de números sinalizados de menor tamanho para sinalizados de maior tamanho, a sinalização é mantida. A conversão é feita internamente sem que haja a necessidade de intervenção de código.

Exemplo 2
sbyte _byte = -127; //1 byte
short valor = _byte; //2 bytes, sinal mantido
Console.WriteLine(valor);
Saída
-127

No casting explícito, o tipo de dados de destino é informado manualmente. A expressão é validada e convertida para o tipo de dado informado como destino. Nesse tipo de casting, há perda de dados.

Sintaxe : perda de dados
ulong > uint > ushort > byte
Sintaxe : casting
tipo_de_dado_cast nome_variavel = (tipo_de_dado_cast)expressao;
Exemplo 3
int a = 256; //4 bytes 0x00000100
byte b; //1 byte
b = (byte)a; //4 bytes > 1 byte :  0x000001(00) > (00)
        
Console.WriteLine(b);
Saída
0

De forma sucinta, com o boxing convertemos um valor de tipo de dado para um tipo object de forma a termos uma referência e não mais um valor. Não há necessidade de utilizar casting no boxing.

Sintaxe
object nome_objeto = valor; //primitivo, struct, enum
Exemplo 4
using System;
public class Program
{
	public static void Main()
	{
		Object objeto = "uma string em C#";
		Console.WriteLine(objeto);
	}
}
Saída
um string em C#

O unboxing é o processo inverso do boxing onde temos o valor e não mais uma referência. No unboxing precisamos utilizar casting.

Exemplo 5
using System;
public class Program
{
	public static void Main()
	{
		Object objeto = "uma string em C#";
		string str = (string)objeto;
		Console.WriteLine(str);
	}
}
Saída
um string em C#

Caso a operação de unboxing não possa ser realizada, um erro ou exceção InvalidCastExection será "lançada",] como pode ser visto na saída do exemplo 6 abaixo:

Exemplo 6
using System;
public class Program
{
	public static void Main()
	{
		Object objeto = "uma string em D Bemol";
		int str = (int)objeto;
	}
}
Saída
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Int32'

Além do casting mostrado acima, a linguagen C# fornece o operador as. O uso desse operador é feito conforme a sintaxe abaixo:

Sintaxe
tipo_dado nome_objeto = valor|objeto as tipo_dado;
Exemplo 7
using System;
public class Program
{
	public static void Main()
	{
		object obj = "uma string";
		string str = obj as string;

		Console.WriteLine(str);
	}
}
Saída
uma string

O uso do as pode ser feito com outros tipos de dados além do tipo string utilizado no exemplo acima. Classes e Interfaces também podem ser utilizados, por exemplo.

No casting discutido acima, com perda de dado, e de acordo com os tipos de dados estudados, temos como exemplo a relação das seguintes perdas de dados:

Tab. 1: Perda de dados. * tamanho em bytes
Origem Tamanho* Destino Tamanho* Dados perdidos*
long int 8 int 4 4
int 8 short 2 2
short 8 byte 1 1
long double 8 double 8 8
long float 8 float 4 4

  1. 05/08/2025 - revisão 2 - Correções: pontuais, sintaxes e 'is' movido p/ 'Variáveis'
  2. 15/10/2024 - revisão 1 - Correção: Exemplos; Ajustes pontuais
  3. 05/03/2024 - versão inicial