Por que o Convert.ChanType pega um parâmetro de objeto?
-
27-09-2019 - |
Pergunta
o Convert
A classe existe desde o .NET 1.0. o IConvertible
A interface também existe desde então.
o Convert.ChangeType
método só funciona em objetos de tipos que implementam IConvertible
(De fato, a menos que esteja enganado, tudo dos métodos de conversão fornecidos pelo Convert
A classe é assim). Então, por que o tipo de parâmetro object
?
Em outras palavras, em vez disso:
public object ChangeType(object value, Type conversionType);
Por que a assinatura não é isso?
public object ChangeType(IConvertible value, Type conversionType);
Parece estranho para mim.
Solução
Olhando no refletor, você pode ver o topo de ChangeType(object, Type, IFormatProvider)
, que é o que é chamado sob as cobertas:
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;
}
Então parece um objeto de um tipo que não implemento IConvertible
mas já é O tipo de destino retornará apenas o objeto original.
Concedido parece que este é o só exceção ao valor que precisa de implementar IConvertible
, mas é uma exceção e parece o motivo pelo qual o parâmetro é object
em vez de.
Aqui está um rápido teste de Linqpad para este 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;
}