Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Conversiones de tipos en C#
Dado que a C# se le asignan tipos estticos en tiempo de compilacin, despus de declarar una variable, no se puede volver
a declarar ni tampoco utilizar para almacenar valores de otro tipo, a menos que dicho tipo pueda convertirse en el tipo de la
variable. Por ejemplo, no existe conversin de un entero a una cadena arbitraria cualquiera. Por lo tanto, despus de
declarar i como entero, no puede asignarle la cadena "Hello", como se muestra en el cdigo siguiente.
int i;
i = "Hello"; // Error: "Cannot implicitly convert type 'string' to 'int'"
Sin embargo, en ocasiones puede que sea necesario copiar un valor en un parmetro de mtodo o variable de otro tipo. Por
ejemplo, puede que tenga una variable de tipo entero que deba pasar a un mtodo cuyo parmetro es de tipo double.
Estos tipos de operaciones se denominan conversiones de tipos. En C#, puede realizar los siguientes tipos de conversiones:
Conversiones implcitas: no se requiere una sintaxis especial porque la conversin se realiza con seguridad de
tipos y no se perdern datos. Entre los ejemplos se incluyen las conversiones de tipos enteros de menor a mayor y
las conversiones de clases derivadas en clases base.
Conversiones definidas por el usuario: las conversiones definidas por el usuario se realizan a travs de
mtodos especiales que puede definir para habilitar las conversiones explcitas e implcitas entre tipos
personalizados que no tienen una relacin de clase base-clase derivada. Para obtener ms informacin, vea
Operadores de conversin (Gua de programacin de C#).
Conversiones con clases auxiliares: para realizar conversiones entre tipos no compatibles, como los enteros y
los objetos System..::.DateTime, o bien cadenas hexadecimales y matrices de bytes, puede utilizar la clase
System..::.BitConverter, la clase System..::.Convert y los mtodos Parse de los tipos numricos integrados, como
Int32..::.Parse..
Conversiones implcitas
En los tipos numricos integrados, puede realizarse una conversin implcita cuando el valor que se va a almacenar puede
ajustarse a la variable sin necesidad de truncamiento o redondeo. Por ejemplo, una variable de tipo longlong (Referencia de
C#) (entero de 8 bytes) puede almacenar cualquier valor que pueda almacenar a su vez un elemento intint (Referencia de
C#) (4 bytes en un equipo de 32 bits). En el ejemplo siguiente, el compilador convierte implcitamente el valor de la
derecha en un tipo long antes de asignarlo a bigNum.
// Implicit conversion. num long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
byte
short
ushort
int
uint
long
char
float
double
ulong
Comentarios
Las conversiones de int, uint o long a float y de long a double pueden causar una prdida de precisin, pero no
No hay ninguna conversin implcita entre los tipos de punto flotante y el tipo decimal.
Una expresin constante de tipo int se puede convertir a sbyte, byte, short, ushort, uint o ulong, siempre que
el valor de la expresin constante quede dentro del intervalo del tipo de destino.
Conversiones explcitas
Sin embargo, si no se puede realizar una conversin sin riesgo de perder informacin, el compilador requiere que se realice
una conversin explcita, denominada conversin de tipo. Una conversin de tipo es una manera de informar al compilador
de forma explcita de que pretende realizar la conversin y que est al tanto de que puede producirse una prdida de datos.
Para realizar una conversin de tipo, especifique entre parntesis el tipo al que se va a aplicar dicha conversin delante del
valor o la variable que se va a convertir. El programa no se compilar sin el operador de conversin de tipo.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Para
sbyte
byte
Sbyte o char
short
ushort
int
uint
long
ulong
char
float
sbyte, byte, short, ushort, int, uint, long, ulong, charo decimal
double
sbyte, byte, short, ushort, int, uint, long, ulong, char, floato decimal
decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float o double
Comentarios
Las conversiones numricas explcitas pueden producir prdida de precisin o provocar excepciones.
Cuando se convierte un valor decimal en un tipo integral, este valor se redondea hacia cero al valor entero ms
prximo. Si el valor entero resultante queda fuera del intervalo del tipo de destino, se produce una excepcin
OverflowException.
Cuando se convierte un valor double o float en un tipo integral, el valor se trunca. Si el valor entero resultante
queda fuera del intervalo del valor de destino, el resultado depende del contexto de comprobacin de
desbordamiento. En un contexto comprobado, se produce una excepcin OverflowException, mientras que en un
contexto no comprobado, el resultado es un valor no especificado del tipo de destino.
Cuando se convierte double en float, el valor double se redondea al valor float ms prximo. Si el valor de tipo
double es demasiado pequeo o demasiado grande para ajustarse al tipo de destino, el resultado ser cero o
infinito.
Cuando se convierte float o double en decimal, el valor de origen se convierte en una representacin decimal y
se redondea al nmero ms prximo despus de la vigsimo octava posicin decimal si es necesario. Segn el
valor de origen, se puede producir uno de los siguientes resultados:
Si el valor de origen es demasiado pequeo para representarlo como decimal, el resultado se convierte
en cero.
Si el valor de origen es NaN (no es un nmero), infinito o demasiado grande para ser representado como
Cuando se convierte decimal en float o double, el valor decimal se redondea al valor double o float ms
prximo.
LITERALES
ENTEROS
El tipo de un literal entero se determina como sigue:
Si el literal no tiene sufijo, su tipo es el primero de los tipos en los cuales se puede representar su valor: int, uint,
long, ulong.
Si el literal tiene el sufijo U o u, su tipo es el primero de los tipos en los cuales se puede representar su valor: uint,
ulong.
Si el literal tiene el sufijo L o l, su tipo es el primero de los tipos en los cuales se puede representar su valor: long,
ulong.
Si el literal tiene el sufijo UL, Ul, uL, ul, LU, Lu, lU o lu, es de tipo ulong.
REALES
Si no se especifica el sufijo de tipo real, el tipo del literal real es double. De lo contrario, el sufijo de tipo real determina el
tipo del literal real, como sigue:
Un literal real con el sufijo F o f es de tipo float. Por ejemplo, los literales 1f, 1.5f, 1e10f y 123.456F son de tipo
float.
Un literal real con el sufijo D o d es de tipo double. Por ejemplo, los literales 1d, 1.5d, 1e10d y 123.456D son de
tipo double.
Un literal real con el sufijo M o m es de tipo decimal. Por ejemplo, los literales 1m, 1.5m, 1e10m y 123.456M son
de tipo decimal. Este literal se convierte en un valor decimal tomando el valor exacto y, si es necesario,
redondeando al valor ms cercano que se pueda representar mediante el redondeo de banca (Seccin 4.1.7).
Cualquier escala que se detecte en el literal se conserva, salvo que el valor est redondeado o sea cero (en este
caso, el signo y la escala son 0). Por lo tanto, el anlisis del literal 2.900m forma un decimal con signo 0,
coeficiente 2900 y escala 3.
Si el literal especificado no puede representarse en el tipo indicado, se produce un error en tiempo de compilacin.
El valor de un literal real de tipo float o double se determina mediante el uso del modo "redondeo al ms cercano" de IEEE.
Tenga en cuenta que, en un literal real, siempre son necesarios dgitos decimales tras el punto decimal. Por ejemplo, 1.3F es
un literal real, pero no as 1.F.
Convert (Clase)
Convierte un tipo de datos base en otro tipo de datos base.
Espacio de nombres: System
Comentarios
Esta clase devuelve un tipo cuyo valor es equivalente al valor de un tipo especificado. Los tipos base que se admiten son
Boolean, Char, SByte, Byte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Decimal, DateTime y String.
Ninguna conversin. Esto sucede cuando se intenta convertir un tipo en s mismo (por ejemplo, llamando a
Convert..::.ToInt32(Int32) con un argumento de tipo Int32). En este caso, el mtodo devuelve una instancia del
tipo original.
Objeto InvalidCastException. Esto sucede cuando no se admite una conversin determinada. Se produce una
InvalidCastException para las conversiones siguientes:
Una conversin correcta. Para las conversiones entre dos tipos base diferentes no mostradas en los resultados
anteriores, todas las conversiones de ampliacin y todas las conversiones de restriccin que no producen una
prdida de datos sern correctas y el mtodo devolver un valor del tipo base concreto.
Objeto OverflowException. Esto sucede cuando una conversin de restriccin produce una prdida de datos. Por
ejemplo, al intentar convertir una instancia Int32 cuyo valor es 10000 en un tipo Byte se produce una
OverflowException porque 10000 est fuera del intervalo del tipo de datos Byte.
No se producir una excepcin si la conversin de un tipo numrico produce una prdida de precisin, es decir, la prdida de
algunos de los dgitos menos significativos. Sin embargo, la excepcin se producir si el resultado es mayor que lo que
puede representar el tipo de valor devuelto del mtodo de conversin.
Por ejemplo, cuando un tipo Double se convierte en un tipo Single, se puede producir una prdida de precisin pero no se
produce ninguna excepcin. Sin embargo, si la magnitud del tipo Double es demasiado grande para que un tipo Single lo
represente, se produce una excepcin de desbordamiento.