¿Por qué Convert.ChangeType tomar un parámetro de objeto?
-
27-09-2019 - |
Pregunta
La clase Convert
ha estado en existencia desde .NET 1.0. El IConvertible
interfaz también ha existido desde este momento.
El Convert.ChangeType
método sólo Producción en los objetos de tipos que implementan IConvertible
(de hecho, si no me equivoco, todos de los métodos de conversión que proporciona la clase Convert
son de esta manera). ¿Por qué es el tipo de parámetro object
?
En otras palabras, en lugar de esto:
public object ChangeType(object value, Type conversionType);
¿Por qué no es la firma esto?
public object ChangeType(IConvertible value, Type conversionType);
Sólo me parece extraño.
Solución
Mirando en el reflector se puede ver la parte superior de ChangeType(object, Type, IFormatProvider)
, que es lo que se llama bajo las sábanas:
public static object ChangeType(object value, Type conversionType, IFormatProvider provider)
{
//a few null checks...
IConvertible convertible = value as IConvertible;
if (convertible == null)
{
if (value.GetType() != conversionType)
{
throw new InvalidCastException(Environment.GetResourceString("InvalidCast_IConvertible"));
}
return value;
}
Así que parece que un objeto de un tipo que no implemento IConvertible
pero ya es el tipo de destino se acaba de devolver el objeto original.
Es cierto que parece que este es el solamente excepción a la necesidad de poner en práctica el valor IConvertible
, pero es una excepción, y se parece a la razón que el parámetro es object
lugar.
Esta es una prueba rápida para LINQPad este caso:
void Main()
{
var t = new Test();
var u = Convert.ChangeType(t, typeof(Test));
(u is IConvertible).Dump(); //false, for demonstration only
u.Dump(); //dump of a value Test object
}
public class Test {
public string Bob;
}