7

このConvertクラスは、.NET1.0から存在しています。このIConvertible時からインターフェースも存在しています。

このConvert.ChangeTypeメソッドは、実装する型のオブジェクトでのみIConvertible機能します(実際、私が間違っていない限り、クラスによって提供されるすべての変換メソッドはこの方法です)。Convertでは、なぜパラメータタイプなのobjectですか?

言い換えれば、これの代わりに:

public object ChangeType(object value, Type conversionType);

なぜ署名がこれではないのですか?

public object ChangeType(IConvertible value, Type conversionType);

私には奇妙に思えます。

4

1 に答える 1

7

リフレクターを見ると、の上部が見えます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;
}
于 2010-10-03T00:22:47.077 に答える