continuación se presenta una publicando desde el following article:
A menudo se descuida la diferencia entre coerción y colada. Puedo ver porque; muchos idiomas tienen la misma sintaxis y terminología para ambas operaciones. Algunos lenguajes incluso pueden referirse a cualquier conversión como "fundición", pero la siguiente explicación se refiere a conceptos en el CTS.
Si está intentando asignar un valor de algún tipo a una ubicación de un tipo diferente, puede generar un valor del nuevo tipo que tenga un significado similar al original. Esto es coacción. La coerción le permite usar el nuevo tipo al crear un nuevo valor que de alguna manera se asemeja al original. Algunas coerciones pueden descartar datos (por ejemplo, convertir el int 0x12345678 en el 0x5678 corto), mientras que otros pueden no (por ejemplo, convertir el int 0x00000008 en el 0x0008 corto, o el 0x0000000000000008 largo).
Recuerde que los valores pueden tener varios tipos. Si su situación es ligeramente diferente, y solo desea seleccionar uno diferente de los tipos de valor, el casting es la herramienta para el trabajo. Casting simplemente indica que desea operar en un tipo particular que incluye un valor.
La diferencia en el nivel de código varía de C# a IL. En C#, tanto la fundición y la coacción se ven bastante similares:
static void ChangeTypes(int number, System.IO.Stream stream)
{
long longNumber = number;
short shortNumber = (short)number;
IDisposable disposableStream = stream;
System.IO.FileStream fileStream = (System.IO.FileStream)stream;
}
A nivel de IL son bastante diferentes:
ldarg.0
conv.i8
stloc.0
ldarg.0
conv.i2
stloc.1
ldarg.1
stloc.2
ldarg.1
castclass [mscorlib]System.IO.FileStream
stloc.3
En cuanto al nivel lógico, hay algunas diferencias importantes. Lo que es más importante recordar es que la coerción crea un nuevo valor, mientras que el casting no lo hace. La identidad del valor original y el valor después del lanzamiento son los mismos, mientras que la identidad de un valor coaccionado difiere del valor original; coersion crea una instancia nueva y distinta, mientras que la conversión no. Un corolario es que el resultado del lanzamiento y el original siempre serán equivalentes (tanto en identidad como en igualdad), pero un valor forzado puede o no ser igual al original, y nunca comparte la identidad original.
Es fácil ver las implicaciones de la coerción en los ejemplos anteriores, ya que los tipos numéricos siempre se copian por su valor. Las cosas se ponen un poco más complicadas cuando trabajas con tipos de referencia.
class Name : Tuple<string, string>
{
public Name(string first, string last)
: base(first, last)
{
}
public static implicit operator string[](Name name)
{
return new string[] { name.Item1, name.Item2 };
}
}
En el ejemplo siguiente, una conversión es un yeso, mientras que el otro es un coacción.
Tuple<string, string> tuple = name;
string[] strings = name;
Después de estas conversiones, tuplas y el nombre son iguales, pero las cadenas no es igual a ninguno de ellos. Podría hacer que la situación sea ligeramente mejor (o un poco más confusa) al implementar Equals() y operator ==() en la clase Name para comparar un Nombre y una cadena [].Estos operadores "arreglarían" el problema de comparación, pero aún tendrían dos instancias separadas; cualquier modificación de las cadenas no se reflejaría en nombre o tupla, mientras que los cambios a uno de nombre o tupla se reflejarían en nombre y tupla, pero no en cadenas.
Aunque el ejemplo de arriba intentaba ilustrar algunas diferencias entre el casting y la coerción, también sirve como un gran ejemplo de por qué debe ser extremadamente precavido al usar operadores de conversión con tipos de referencia en C#.
¿Qué pasa con el [artículo de Wikipedia] (http://en.wikipedia.org/wiki/Type_conversion)? –