1

Object Convert.ChangeType( Object object, Type type)の型がobject一致すると、内部で何が起こるのだろうかと思っていtypeます。ショートカットして戻るだけobjectですか?

例えば:

object objString = "Hello World";

string converted = (string) Convert.ChangeType( objString, typeof ( String ) );

の実装はChangeType実際にIConvertibleインターフェイスを呼び出すのでしょうか、それとも単に objString を返すだけでしょうか?

4

3 に答える 3

6

According to Microsoft's C# reference source, Convert.ChangeType(Object, Type) performs the following general behaviour:

  • If the input is null
    • If the type is a value type, throw.
    • Otherwise return null.
  • If the input is not IConvertible
    • If the type is exactly the input's type, return the input.
    • Otherwise throw.
  • If the type is one of the out-of-the-box core convertible types, call the corresponding ToWhatever method on the input.
    • In each case, the implementation seems to be return this if the types match or return Convert.ToWhatever(this) otherwise, which is a shortcut of sorts.
  • Otherwise call ToType on the input, passing the type through.
于 2012-10-08T14:55:29.067 に答える
2

はい、オブジェクトの IConvertible インターフェイスを呼び出します。文字列の場合、それは objString.ToString() を呼び出し、それ自体が返されます (これを返します)。

さらに、オブジェクトのタイプが IConvertible を実装せず、同じタイプに変換すると、同じオブジェクトが返されます。

type が IConvertible を実装せず、別の型に変換すると、例外がスローされます。

于 2012-10-08T13:24:55.770 に答える
0

この MSDN ブログ記事が役立つ場合があります。

クラスが IConvertable インターフェイスを実装している場合は、System.Convert.ChangeType を使用してデータ型を変更できます。

decimal x = (decimal) System.Convert.ChangeType("5", typeof(decimal));

ChangeType は大きな switch ステートメント (VB ではケースを選択) と考えてください... オーバーロードされた関数がたくさんあります。このようなもの (免責事項: これは疑似コードであり、正確な .NET の実装ではありません):

public static Object ChangeType(Object value, TypeCode typeCode , IFormatProvider provider)
{

IConvertible v = value as IConvertible;

switch (typeCode) {

case TypeCode.Boolean:
    return v.ToBoolean(provider);

case TypeCode.Char:
    return v.ToChar(provider);

case TypeCode.SByte:
    return v.ToSByte(provider);

case TypeCode.Byte:
    return v.ToByte(provider);

case TypeCode.Int16:
    return v.ToInt16(provider);

case TypeCode.UInt16:
    return v.ToUInt16(provider);

. . .

}

IConvertible インターフェイスを実装すると主張するクラスは、上記のスイッチ構造に加えて GetTypeCode のすべての変換を実装する必要があります。

· GetTypeCode

· ToBoolean

・ToByte

・ToChar

· ToDateTime

· ToDecimal

・ToDouble

· ToInt16

· ToInt32

· ToInt64

・ToSByte

・ToSingle

· ToString

・ 入力し

・ToUInt16

・ToUInt32

・ToUInt64

System.Convert クラスには、IConvertible インターフェイスを実装するクラスによって順番に呼び出すことができる多数の実装があります。

于 2012-10-08T13:31:02.297 に答える