Domanda

La classe Convert è in vigore dal .NET 1.0. Il IConvertible interfaccia è esistito anche perché questa volta.

Il Convert.ChangeType metodo solo opere su oggetti di tipi che implementano IConvertible (in realtà, se non mi sbaglio, tutti dei metodi di conversione forniti dalla classe Convert sono in questo modo). Allora, perché è il tipo di parametro object?

In altre parole, invece di questo:

public object ChangeType(object value, Type conversionType);

Perché non è la firma questo?

public object ChangeType(IConvertible value, Type conversionType);

Proprio sembra strano per me.

È stato utile?

Soluzione

In cerca riflettore è possibile vedere la cima della ChangeType(object, Type, IFormatProvider), che è ciò che è chiamato sotto le coperte:

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

Quindi sembra che un oggetto di un tipo che non attuare IConvertible ma già è il tipo di destinazione sarà solo restituire l'oggetto originale.

Certo sembra che questo è il solo eccezione per il valore che necessitano di implementare IConvertible, ma è un'eccezione, e si presenta come il motivo per il parametro è invece object.


Ecco un test rapido LINQPad per questo 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top