The Convert class has been in existence since .NET 1.0. The IConvertible interface has also existed since this time.
The Convert.ChangeType method only work
Looking in reflector you can see the top of ChangeType(object, Type, IFormatProvider)
, which is what's called under the covers:
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 it looks like an object of a type that doesn't implement IConvertible
but already is the destination type will just return the original object.
Granted it looks like this is the only exception to the value needing to implement IConvertible
, but it is an exception, and looks like the reason the parameter is object
instead.
Here's a quick LinqPad test for this case:
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;
}