Pourquoi Convert.ChangeType prendre un paramètre d'objet?
-
27-09-2019 - |
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.
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;
}