Está en la página 1de 5

PROGRAMACION III LABORATORIO III

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 explcitas (conversiones de tipos): las conversiones explcitas requieren un operador de


conversin. Las variables de origen y destino son compatibles, pero existe el riesgo de perder datos debido a que el
tipo de la variable de destino es ms pequeo que (o es una clase base de) la variable de origen.

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;

Tabla de conversiones numricas implcitas


La tabla siguiente muestra las conversiones numricas implcitas predefinidas. Las conversiones implcitas se pueden dar en
muchas ocasiones, incluidas la invocacin a mtodos y las instrucciones de asignacin.
De

PROGRAMACION III LABORATORIO III


sbyte

short, int, long, float, double o decimal

byte

short, ushort, int, uint, long, ulong, float, double o decimal

short

int, long, float, double o decimal

ushort

int, uint, long, ulong, float, double o decimal

int

long, float, double o decimal

uint

long, ulong, float, double o decimal

long

float, double o decimal

char

ushort, int, uint, long, ulong, float, double o decimal

float

double

ulong

float, double o decimal

Comentarios
Las conversiones de int, uint o long a float y de long a double pueden causar una prdida de precisin, pero no

una prdida de magnitud.

No existen conversiones implcitas al tipo char.

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

PROGRAMACION III LABORATORIO III

Tabla de conversiones numricas explcitas (Referencia de C#)


Las conversiones numricas explcitas se utilizan para convertir cualquier tipo numrico a cualquier otro tipo numrico, para
el que no existe conversin implcita, mediante una expresin que utilice el operador de conversin explcita. La siguiente
tabla muestra estas conversiones.
De

Para

sbyte

byte, ushort, uint, ulong o char

byte

Sbyte o char

short

sbyte, byte, ushort, uint, ulong o char

ushort

sbyte, byte, short o char

int

sbyte, byte, short, ushort, uint, ulongo char

uint

sbyte, byte, short, ushort, int o char

long

sbyte, byte, short, ushort, int, uint, ulong o char

ulong

sbyte, byte, short, ushort, int, uint, long o char

char

sbyte, byte o short

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.

PROGRAMACION III LABORATORIO III

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

decimal, se produce una excepcin OverflowException.

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.

PROGRAMACION III LABORATORIO III


Existe un mtodo de conversin para convertir todos y cada uno de los tipos base en los dems tipos base. Sin embargo, la
llamada real a un mtodo de conversin determinado puede generar uno de cuatro resultados, dependiendo del valor del
tipo base en tiempo de ejecucin y el tipo base de destino. Estos cuatro resultados son:

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:

Conversiones de Char a Boolean, Single, Double, Decimal o DateTime.

Conversiones de Boolean, Single, Double, Decimal o DateTime a Char.

Conversiones de DateTime en cualquier otro tipo excepto String.

Conversiones de cualquier otro tipo, excepto String en DateTime.

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.

También podría gustarte