Perché Convert.ChangeType prende un parametro oggetto?
-
27-09-2019 - |
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.
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;
}