Pergunta

o Convert A classe existe desde o .NET 1.0. o IConvertible A interface também existe desde então.

o Convert.ChangeType método funciona em objetos de tipos que implementam IConvertible (De fato, a menos que esteja enganado, tudo dos métodos de conversão fornecidos pelo Convert A classe é assim). Então, por que o tipo de parâmetro object?

Em outras palavras, em vez disso:

public object ChangeType(object value, Type conversionType);

Por que a assinatura não é isso?

public object ChangeType(IConvertible value, Type conversionType);

Parece estranho para mim.

Foi útil?

Solução

Olhando no refletor, você pode ver o topo de ChangeType(object, Type, IFormatProvider), que é o que é chamado sob as cobertas:

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;
  }

Então parece um objeto de um tipo que não implemento IConvertible mas já é O tipo de destino retornará apenas o objeto original.

Concedido parece que este é o exceção ao valor que precisa de implementar IConvertible, mas é uma exceção e parece o motivo pelo qual o parâmetro é object em vez de.


Aqui está um rápido teste de Linqpad para 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top