Question

La classe Convert est existe depuis .NET 1.0. l'interface IConvertible a également existé depuis cette époque.

La méthode Convert.ChangeType uniquement œuvres sur les objets de types qui mettent en œuvre IConvertible (en fait, à moins que je ne me trompe pas, tous des méthodes de conversion fournies par la classe Convert sont de cette façon). Alors, pourquoi le object type de paramètre?

En d'autres termes, au lieu de ceci:

public object ChangeType(object value, Type conversionType);

Pourquoi pas la signature cela?

public object ChangeType(IConvertible value, Type conversionType);

Juste me semble étrange.

Était-ce utile?

La solution

Recherche dans le réflecteur vous pouvez voir le haut de ChangeType(object, Type, IFormatProvider), qui est ce qu'on appelle sous les couvertures:

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

Il ressemble à un objet d'un type ne pas mettre en œuvre IConvertible mais déjà le type de destination juste retour l'objet original.

Certes, elle ressemble à ceci est le uniquement exception à la valeur besoin de mettre en œuvre IConvertible, mais il est une exception, et ressemble à la raison pour laquelle le paramètre est object à la place.


Voici un test de LINQPad rapide pour ce cas:

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top