Classe Convert

Esta classe possui diversos métodos para conversões de tipo. Veja um exemplo:

1
2
3
decimal N = 123456.789m; string s;
s = Convert.ToString(N);
Console.WriteLine(s);

Essa classe retorna um tipo cujo valor não equivale ao valor de um tipo especificado. Os tipos de base com suporte são Boolean, Char, SByte, Byte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal, DateTime e String.

Um método de conversão existe para converter cada Tipo base para todos os outros tipos base. No entanto, a chamada real para um método de conversão específica pode produzir um dos quatro resultados, dependendo do valor do tipo base em tempo de execução e o tipo de base de destino. Esses quatro resultados são:

  • Nenhuma conversão. Isso ocorre quando é feita uma tentativa para converter de um tipo a mesmo (por exemplo, chamando Convert.ToInt32(Int32) com um argumento de tipo Int32). Nesse caso, o método simplesmente retorna uma instância do tipo original.
  • InvalidCastException. Isso ocorre quando uma conversão específica não tem suporte. Um InvalidCastException é lançada para as seguintes conversões:
    • Conversões de Char a Boolean, Single, Double, Decimalou DateTime.
    • Conversões de Boolean, Single, Double, Decimalou DateTime a Char.
    • Conversões de DateTime para qualquer outro tipo exceto String.
    • Conversões de qualquer outro tipo, exceto String, para DateTime.
  • Uma conversão bem-sucedida. Para conversões entre dois diferentes tipos base não listados nos resultados anteriores, Tudodas as conversões de expansão bem como Tudodas as conversões de restrição que resultarem em uma perda de dados terá êxito e o método retornará um valor do tipo base destino.
  • OverflowException. Isso ocorre quando uma restrição resulta de conversão em uma perda de dados. Por exemplo, tentando converter uma instância de Int32 cujo valor é 10000 para um tipo de Byte lança um OverflowException porque 10000 está fora do intervalo do tipo de dados Byte.

Uma exceção não será lançada se a conversão de um tipo numérico resultar em perda de precisão (ou seja, a perda de alguns menos dígitos significativos). No entanto, uma exceção será lançada se o resultado é Grande do que pode ser representado por tipo de valor de retorno do método de conversão específica.

Por exemplo, quando um Double é convertido em um Single, pode ocorrer a perda de precisão, mas nenhuma exceção é lançada. No entanto, se a magnitude do Double for muito grande para ser representado por um Single, uma exceção de estouro é lançada.

Veja outro exemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
double dNumber = 23.15;
 
try {
	// retorna 23
	int    iNumber = System.Convert.ToInt32(dNumber);
}
catch (System.OverflowException) {
	System.Console.WriteLine(
				"Overflow (estouro) na conversão de double para int.");
}
// retorna True
bool   bNumber = System.Convert.ToBoolean(dNumber);
 
// retorna "23.15"
string strNumber = System.Convert.ToString(dNumber);
 
try {
	// retorna '2'
	char chrNumber = System.Convert.ToChar(strNumber[0]);
} 
catch (System.ArgumentNullException) {
	System.Console.WriteLine("A String é nula (null)");
}
catch (System.FormatException) {
	System.Console.WriteLine("A largura da String é maior que 1.");
}
 
// System.Console.ReadLine() retorna uma string a ser convertida
int newInteger = 0;
try {
	System.Console.WriteLine("Informe um valor inteiro:");
	newInteger = System.Convert.ToInt32(
						System.Console.ReadLine());
}
catch (System.ArgumentNullException) {
	System.Console.WriteLine("A String é nula (null).");
}
catch (System.FormatException) {
	System.Console.WriteLine(" A String não contém um valor válido para conversão.");
} 
catch (System.OverflowException) {
	System.Console.WriteLine(
	"Estouro na conversão de string para int.");
}
 
System.Console.WriteLine("O valor do inteiro informado convertido para double: {0}",
						 System.Convert.ToDouble(newInteger));

Conversões

Você pode usar tipos numéricos diferentes em expressões. Neste caso, as seguintes conversões ocorrem:

  • Quando misturados tipos inteiros e ponto flutuante, os tipos numéricos são convertidos para ponto flutuante.
  • Os tipos inteiros de menor faixa são convertidos para os de maior faixa, por exemplo, de short para int.

As conversões são feitas automaticamente apenas quando o tipo a receber o valor (do lado esquerdo de uma atribuição) puder conter todos os possíveis valores da expressão (do lado direito de uma atribuição). Muitas conversões não são permitidas, como por exemplo:

  • Entre tipos com e sem sinal de variáveis inteiras do mesmo tamanho (por exemplo, entre int e uint).
  • Atribuições de variáveis inteiras com sinal para inteiros sem sinal, qualquer que seja o seu tamanho.
  • Entre o tipo decimal (de grande resolução) e ambos os tipos de ponto flutuante IEEE, double e float (de maior faixa).
  • Atribuir um double a um float.
  • Atribuir números de ponto flutuante a variáveis inteiras.

Caso você precise fazer uma conversão na qual exista perda de informação, você pode forçá-la com um operador de conversão, como no exemplo abaixo:

1
2
3
4
5
6
7
...
long   myLong = 22;
int   myInt = myLong;<span> </span>// Error 
int   myInt = <strong>(int)</strong>myLong; // OK
int   x = 3.0;<span> </span>// Error
int   y = (int)3.0;<span> </span>// OK
...

As conversões automáticas entre os tipos por valor são as seguintes:

De

Para

sbyte

short, int, long, float, double, ou decimal.

byte

short, ushort, int, uint, long, ulong, float, double, ou decimal.

short

int, long, float, double, ou decimal.

ushort

int, uint, long, ulong, float, double, ou decimal.

int

long, float, double, ou decimal.

uint

long, ulong, float, double, ou decimal.

long

float, double, ou decimal.

ulong

float, double, ou decimal.

char

ushort, int, uint, long, ulong, float, double, ou decimal.

float

double.