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

Quando usamos casting com () e caso não seja possível realizar o casting, uma exceção do tipo InvalidCastException será lançada gerada.

Esse casting sempre deve ser usado quando temos certeza de que o valor em que aplicamos o casting sempre será um válido.

O tratamento de erro no casting em questão deve ser feito utilizando um bloco try-catch que pode ser visto em #: Tratando Erros > Try-Catch.

Exemplo 8
using System;

public class HelloWorld 
{	
   static void Main() 
  {    
	   object val = "string";
		int valor = (int)val; 
  }
}
Saída
Unhandled exception. System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.Int32'.
   at HelloWorld.Main()

Quando usamos o operador as, caso o casting não seja possível, um valor null é retornado pelo operador ao invés de ser lançada uma exceção. Um tipo de dado nullable deve ser usado nesse caso.

Esse casting sempre deve ser usado quando não temos certeza de que o valor em que aplicamos o casting será um válido.

Exemplo 9
using System;

public class HelloWorld 
{	
   static void Main() 
  {    
	   object obj1 = "um object string";

	   object obj2 = obj1 as string;
	   Console.WriteLine(obj2); //string -> string OK!!
	   
	   obj2 = obj1 as int?; //string -> int NOK!!
	   Console.Write(obj2 == null);
  }
}
Saída
um object string
True

O tratamento de erro no casting em questão pode ser feito utilizando comandos de decisão em que uma validação pode ser feita para exibição de mensagens de erro, por exemplo.

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