Frage

Die Convert Klasse ist seit dem .NET in Existenz gewesen 1.0. Die IConvertible Schnittstelle ist ebenfalls seit dieser Zeit existiert hat.

Die Convert.ChangeType Methode nur Werke auf Objekte von Typen, die IConvertible implementieren (in der Tat, es sei denn, ich irre, alle der Umwandlung durch die Convert-Klasse Methoden sind auf diese Weise). Warum also ist der Parametertyp object?

Mit anderen Worten, anstelle diesem:

public object ChangeType(object value, Type conversionType);

Warum ist nicht die Unterschrift das?

public object ChangeType(IConvertible value, Type conversionType);

Nur scheint mir fremd.

War es hilfreich?

Lösung

Reflektor Suchen können Sie die Spitze ChangeType(object, Type, IFormatProvider) sehen, was ist das, was unter der Decke genannt:

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

So ist es wie ein Objekt eines Typs sieht, dass nicht IConvertible implementieren, aber schon ist der Zieltyp wird nur das ursprüngliche Objekt zurück.

Zugegeben sieht es aus wie das die nur Ausnahme auf den Wert, um IConvertible zu implementieren, aber es ist eine Ausnahme, und sieht aus wie der Grund die Parameter object statt.


Hier ist ein schneller LinqPad Test für diesen Fall:

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top