Why does Convert.ChangeType take an object parameter?

你说的曾经没有我的故事 提交于 2019-12-04 03:22:50

问题


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 works on objects of types that implement IConvertible (in fact, unless I'm mistaken, all of the conversion methods provided by the Convert class are this way). So why is the parameter type object?

In other words, instead of this:

public object ChangeType(object value, Type conversionType);

Why isn't the signature this?

public object ChangeType(IConvertible value, Type conversionType);

Just seems strange to me.


回答1:


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;
}


来源:https://stackoverflow.com/questions/3847997/why-does-convert-changetype-take-an-object-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!