リフレクターを見ると、の上部が見えますChangeType(object, Type, IFormatProvider)
。これは、カバーの下と呼ばれるものです。
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;
}
したがって、実装されていないタイプのオブジェクトのように見えますが、IConvertible
すでに宛先タイプである場合は、元のオブジェクトを返すだけです。
確かに、これは実装する必要のある値の唯一IConvertible
の例外のように見えますが、これは例外であり、パラメータがobject
代わりにある理由のように見えます。
この場合の簡単なLinqPadテストは次のとおりです。
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;
}