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.

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top