英語で読む

次の方法で共有


Convert.ChangeType メソッド

定義

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。

オーバーロード

ChangeType(Object, Type)

指定した型のオブジェクトを返し、その値が指定したオブジェクトと等しい値を返します。

ChangeType(Object, TypeCode)

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。

ChangeType(Object, Type, IFormatProvider)

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。 パラメーターは、カルチャ固有の書式設定情報を提供します。

ChangeType(Object, TypeCode, IFormatProvider)

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。 パラメーターは、カルチャ固有の書式設定情報を提供します。

ChangeType(Object, Type)

ソース:
Convert.cs
ソース:
Convert.cs
ソース:
Convert.cs

指定した型のオブジェクトを返し、その値が指定したオブジェクトと等しい値を返します。

C#
public static object ChangeType (object value, Type conversionType);
C#
public static object? ChangeType (object? value, Type conversionType);

パラメーター

value
Object

IConvertible インターフェイスを実装するオブジェクト。

conversionType
Type

返すオブジェクトの型。

戻り値

型が conversionType で、その値が valueと等しいオブジェクト。

-又は-

valuenull で、conversionType が値型でない場合は、null 参照 (Visual Basic でNothing)。

例外

この変換はサポートされていません。

-又は-

valuenull で、conversionType は値型です。

-又は-

value では、IConvertible インターフェイスは実装されません。

value は、conversionTypeで認識される形式ではありません。

value は、conversionTypeの範囲外の数値を表します。

conversionTypenullです。

次の例は、ChangeType メソッドの使用方法を示しています。

C#
using System;

public class ChangeTypeTest {
    public static void Main() {

        Double d = -2.345;
        int i = (int)Convert.ChangeType(d, typeof(int));

        Console.WriteLine("The double value {0} when converted to an int becomes {1}", d, i);

        string s = "12/12/98";
        DateTime dt = (DateTime)Convert.ChangeType(s, typeof(DateTime));

        Console.WriteLine("The string value {0} when converted to a Date becomes {1}", s, dt);
    }
}

注釈

ChangeType は、value で指定されたオブジェクトを conversionTypeに変換する汎用変換メソッドです。 value パラメーターは任意の型のオブジェクトにすることができ、conversionType は任意の基本型またはカスタム型を表す Type オブジェクトにすることもできます。 変換を成功させるには、valueIConvertible インターフェイスを実装する必要があります。これは、メソッドが適切な IConvertible メソッドの呼び出しをラップするためです。 このメソッドでは、value から conversionType への変換がサポートされている必要があります。

このメソッドは、変換に現在のスレッドのカルチャを使用します。

注意 (呼び出し元)

ChangeType(Object, Type) メソッドは、列挙値を別の型に変換できます。 ただし、ソース型が列挙型の基になる型であっても、別の型を列挙値に変換することはできません。 型を列挙値に変換するには、キャスト演算子 (C#) または変換関数 (Visual Basic の場合) を使用します。 次の例は、Continent 列挙値との間の変換を示しています。

C#
using System;

public enum Continent
{
   Africa, Antarctica, Asia, Australia, Europe,
   NorthAmerica, SouthAmerica
};

public class Example
{
   public static void Main()
   {
      // Convert a Continent to a Double.
      Continent cont = Continent.NorthAmerica;
      Console.WriteLine("{0:N2}",
                        Convert.ChangeType(cont, typeof(Double)));

      // Convert a Double to a Continent.
      Double number = 6.0;
      try {
         Console.WriteLine("{0}",
                           Convert.ChangeType(number, typeof(Continent)));
      }
      catch (InvalidCastException) {
         Console.WriteLine("Cannot convert a Double to a Continent");
      }

      Console.WriteLine("{0}", (Continent) number);
   }
}
// The example displays the following output:
//       5.00
//       Cannot convert a Double to a Continent
//       SouthAmerica

ChangeType(Object, Type) メソッドは、null 許容型を別の型に変換できます。 ただし、conversionTypeNullable<T>の基になる型である場合でも、別の型を null 許容型の値に変換することはできません。変換を実行するには、キャスト演算子 (C#) または変換関数 (Visual Basic の場合) を使用できます。 次の例は、null 許容型との間の変換を示しています。

C#
using System;

public class Example
{
   public static void Main()
   {
      int? intValue1 = 12893;
      double dValue1 = (double) Convert.ChangeType(intValue1, typeof(Double));
      Console.WriteLine("{0} ({1})--> {2} ({3})", intValue1, intValue1.GetType().Name,
                        dValue1, dValue1.GetType().Name);

      float fValue1 = 16.3478f;
      int? intValue2 = (int) fValue1;
      Console.WriteLine("{0} ({1})--> {2} ({3})", fValue1, fValue1.GetType().Name,
                        intValue2, intValue2.GetType().Name);
   }
}
// The example displays the following output:
//    12893 (Int32)--> 12893 (Double)
//    16.3478 (Single)--> 16 (Int32)

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

ChangeType(Object, TypeCode)

ソース:
Convert.cs
ソース:
Convert.cs
ソース:
Convert.cs

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。

C#
public static object? ChangeType (object? value, TypeCode typeCode);
C#
public static object ChangeType (object value, TypeCode typeCode);

パラメーター

value
Object

IConvertible インターフェイスを実装するオブジェクト。

typeCode
TypeCode

返すオブジェクトの型。

戻り値

基になる型が typeCode で、その値が valueと等しいオブジェクト。

-又は-

valuenull で、typeCodeEmptyString、または Objectの場合は、null 参照 (Visual Basic でNothing)。

例外

この変換はサポートされていません。

-又は-

valuenull され、typeCode は値の型を指定します。

-又は-

value では、IConvertible インターフェイスは実装されません。

value は、typeCode 型で認識される形式ではありません。

value は、typeCode 型の範囲外の数値を表します。

typeCode が無効です。

次の例は、ChangeType(Object, TypeCode) メソッドを使用して、可能であれば、ObjectTypeCode パラメーターで指定された型に変更する方法を示しています。

C#
using System;

public class ChangeTypeTest {
    public static void Main() {

        Double d = -2.345;
        int i = (int)Convert.ChangeType(d, TypeCode.Int32);

        Console.WriteLine("The Double {0} when converted to an Int32 is {1}", d, i);

        string s = "12/12/2009";
        DateTime dt = (DateTime)Convert.ChangeType(s, typeof(DateTime));

        Console.WriteLine("The String {0} when converted to a Date is {1}", s, dt);
    }
}
// The example displays the following output:
//    The Double -2.345 when converted to an Int32 is -2
//    The String 12/12/2009 when converted to a Date is 12/12/2009 12:00:00 AM

注釈

ChangeType(Object, TypeCode) は、value で指定されたオブジェクトを、typeCodeで指定された定義済みの型に変換する汎用変換メソッドです。 value パラメーターには、任意の型のオブジェクトを指定できます。 変換を成功させるには、valueIConvertible インターフェイスを実装する必要があります。これは、メソッドが適切な IConvertible メソッドの呼び出しをラップするためです。 このメソッドでは、value から typeCode への変換もサポートされている必要があります。

ChangeType(Object, TypeCode) メソッドは、カスタム型への value の変換をサポートしていません。 このような変換を実行するには、ChangeType(Object, Type) メソッドを呼び出します。

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

ChangeType(Object, Type, IFormatProvider)

ソース:
Convert.cs
ソース:
Convert.cs
ソース:
Convert.cs

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。 パラメーターは、カルチャ固有の書式設定情報を提供します。

C#
public static object ChangeType (object value, Type conversionType, IFormatProvider provider);
C#
public static object? ChangeType (object? value, Type conversionType, IFormatProvider? provider);

パラメーター

value
Object

IConvertible インターフェイスを実装するオブジェクト。

conversionType
Type

返すオブジェクトの型。

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

戻り値

型が conversionType で、その値が valueと等しいオブジェクト。

-又は-

valuevalueconversionTypeType が等しい場合。

-又は-

valuenull で、conversionType が値型でない場合は、null 参照 (Visual Basic でNothing)。

例外

この変換はサポートされていません。

-又は-

valuenull で、conversionType は値型です。

-又は-

value では、IConvertible インターフェイスは実装されません。

value は、providerによって認識される conversionType の形式ではありません。

value は、conversionTypeの範囲外の数値を表します。

conversionTypenullです。

次の例では、IConvertible インターフェイスを実装する Temperature クラスを定義します。

C#
using System;
using System.Globalization;

public class Temperature : IConvertible
{
   private decimal m_Temp;

   public Temperature(decimal temperature)
   {
      this.m_Temp = temperature;
   }

   public decimal Celsius
   {
      get { return this.m_Temp; }
   }

   public decimal Kelvin
   {
      get { return this.m_Temp + 273.15m; }
   }

   public decimal Fahrenheit
   {
      get { return Math.Round((decimal) (this.m_Temp * 9 / 5 + 32), 2); }
   }

   public override string ToString()
   {
      return m_Temp.ToString("N2") + "°C";
   }

   // IConvertible implementations.
   public TypeCode GetTypeCode()
   {
      return TypeCode.Object;
   }

   public bool ToBoolean(IFormatProvider provider)
   {
      if (m_Temp == 0)
         return false;
      else
         return true;
   }

   public byte ToByte(IFormatProvider provider)
   {
      if (m_Temp < Byte.MinValue || m_Temp > Byte.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the Byte type.",
                                                   this.m_Temp));
      else
         return Decimal.ToByte(this.m_Temp);
   }

   public char ToChar(IFormatProvider provider)
   {
      throw new InvalidCastException("Temperature to Char conversion is not supported.");
   }

   public DateTime ToDateTime(IFormatProvider provider)
   {
      throw new InvalidCastException("Temperature to DateTime conversion is not supported.");
   }

   public decimal ToDecimal(IFormatProvider provider)
   {
      return this.m_Temp;
   }

   public double ToDouble(IFormatProvider provider)
   {
      return Decimal.ToDouble(this.m_Temp);
   }

   public short ToInt16(IFormatProvider provider)
   {
      if (this.m_Temp < Int16.MinValue || this.m_Temp > Int16.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the Int16 type.",
                                                   this.m_Temp));
      else
         return Decimal.ToInt16(this.m_Temp);
   }

   public int ToInt32(IFormatProvider provider)
      {
      if (this.m_Temp < Int32.MinValue || this.m_Temp > Int32.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the Int32 type.",
                                                   this.m_Temp));
      else
         return Decimal.ToInt32(this.m_Temp);
   }

   public long ToInt64(IFormatProvider provider)
   {
      if (this.m_Temp < Int64.MinValue || this.m_Temp > Int64.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the Int64 type.",
                                                   this.m_Temp));
      else
         return Decimal.ToInt64(this.m_Temp);
   }

   public sbyte ToSByte(IFormatProvider provider)
   {
      if (this.m_Temp < SByte.MinValue || this.m_Temp > SByte.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the SByte type.",
                                                   this.m_Temp));
      else
         return Decimal.ToSByte(this.m_Temp);
   }

   public float ToSingle(IFormatProvider provider)
   {
      return Decimal.ToSingle(this.m_Temp);
   }

   public string ToString(IFormatProvider provider)
   {
      return m_Temp.ToString("N2", provider) + "°C";
   }

   public object ToType(Type conversionType, IFormatProvider provider)
   {
      switch (Type.GetTypeCode(conversionType))
      {
         case TypeCode.Boolean:
            return this.ToBoolean(null);
         case TypeCode.Byte:
            return this.ToByte(null);
         case TypeCode.Char:
            return this.ToChar(null);
         case TypeCode.DateTime:
            return this.ToDateTime(null);
         case TypeCode.Decimal:
            return this.ToDecimal(null);
         case TypeCode.Double:
            return this.ToDouble(null);
         case TypeCode.Int16:
            return this.ToInt16(null);
         case TypeCode.Int32:
            return this.ToInt32(null);
         case TypeCode.Int64:
            return this.ToInt64(null);
         case TypeCode.Object:
            if (typeof(Temperature).Equals(conversionType))
               return this;
            else
               throw new InvalidCastException(String.Format("Conversion to a {0} is not supported.",
                                                            conversionType.Name));
         case TypeCode.SByte:
            return this.ToSByte(null);
         case TypeCode.Single:
            return this.ToSingle(null);
         case TypeCode.String:
            return this.ToString(provider);
         case TypeCode.UInt16:
            return this.ToUInt16(null);
         case TypeCode.UInt32:
            return this.ToUInt32(null);
         case TypeCode.UInt64:
            return this.ToUInt64(null);
         default:
            throw new InvalidCastException(String.Format("Conversion to {0} is not supported.", conversionType.Name));
      }
   }

   public ushort ToUInt16(IFormatProvider provider)
   {
      if (this.m_Temp < UInt16.MinValue || this.m_Temp > UInt16.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the UInt16 type.",
                                                   this.m_Temp));
      else
         return Decimal.ToUInt16(this.m_Temp);
   }

   public uint ToUInt32(IFormatProvider provider)
   {
      if (this.m_Temp < UInt32.MinValue || this.m_Temp > UInt32.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the UInt32 type.",
                                                   this.m_Temp));
      else
         return Decimal.ToUInt32(this.m_Temp);
   }

   public ulong ToUInt64(IFormatProvider provider)
   {
      if (this.m_Temp < UInt64.MinValue || this.m_Temp > UInt64.MaxValue)
         throw new OverflowException(String.Format("{0} is out of range of the UInt64 type.",
                                                   this.m_Temp));
      else
         return Decimal.ToUInt64(this.m_Temp);
   }
}

次の例では、Temperature クラスのインスタンスを作成し、ChangeType(Object, Type, IFormatProvider) メソッドを呼び出して、.NET でサポートされている基本的な数値型と Stringに変換します。 ChangeType メソッドがソース型の IConvertible 実装の呼び出しをラップすることを示しています。

C#
public class Example
{
   public static void Main()
   {
      Temperature cool = new Temperature(5);
      Type[] targetTypes = { typeof(SByte), typeof(Int16), typeof(Int32),
                             typeof(Int64), typeof(Byte), typeof(UInt16),
                             typeof(UInt32), typeof(UInt64), typeof(Decimal),
                             typeof(Single), typeof(Double), typeof(String) };
      CultureInfo provider = new CultureInfo("fr-FR");

      foreach (Type targetType in targetTypes)
      {
         try {
            object value = Convert.ChangeType(cool, targetType, provider);
            Console.WriteLine("Converted {0} {1} to {2} {3}.",
                              cool.GetType().Name, cool.ToString(),
                              targetType.Name, value);
         }
         catch (InvalidCastException) {
            Console.WriteLine("Unsupported {0} --> {1} conversion.",
                              cool.GetType().Name, targetType.Name);
         }
         catch (OverflowException) {
            Console.WriteLine("{0} is out of range of the {1} type.",
                              cool, targetType.Name);
         }
      }
   }
}
// The example dosplays the following output:
//       Converted Temperature 5.00°C to SByte 5.
//       Converted Temperature 5.00°C to Int16 5.
//       Converted Temperature 5.00°C to Int32 5.
//       Converted Temperature 5.00°C to Int64 5.
//       Converted Temperature 5.00°C to Byte 5.
//       Converted Temperature 5.00°C to UInt16 5.
//       Converted Temperature 5.00°C to UInt32 5.
//       Converted Temperature 5.00°C to UInt64 5.
//       Converted Temperature 5.00°C to Decimal 5.
//       Converted Temperature 5.00°C to Single 5.
//       Converted Temperature 5.00°C to Double 5.
//       Converted Temperature 5.00°C to String 5,00°C.

注釈

ChangeType は、value で指定されたオブジェクトを conversionTypeに変換する汎用変換メソッドです。 value パラメーターは任意の型のオブジェクトにすることができ、conversionType は任意の基本型またはカスタム型を表す Type オブジェクトにすることもできます。 変換を成功させるには、valueIConvertible インターフェイスを実装する必要があります。これは、メソッドが適切な IConvertible メソッドの呼び出しをラップするためです。 このメソッドでは、value から conversionType への変換がサポートされている必要があります。

provider パラメーターは、変換の書式設定情報を提供する IFormatProvider 実装です。 このパラメーターの使用方法と使用方法は、基になる IConvertible 実装によって異なります。 value が基本データ型の場合、provider は次の変換にのみ使用されます。

  • 数値から文字列への変換、または文字列から数値への変換。 provider は、CultureInfo オブジェクト、NumberFormatInfo オブジェクト、または NumberFormatInfo オブジェクトを返すカスタム IFormatProvider 実装である必要があります。 ただし、ChangeType(Object, TypeCode, IFormatProvider) メソッドは既定の "G" 書式指定子を使用して変換を実行するため、value またはターゲットの型が符号なし整数の場合、provider パラメーターは無効です。 providernull場合は、現在のカルチャを表す CultureInfo オブジェクトが使用されます。

  • DateTime 値から文字列への変換、または文字列から DateTime 値への変換。 provider は、CultureInfo または DateTimeFormatInfo オブジェクトである必要があります。 providernull場合は、現在のカルチャを表す CultureInfo オブジェクトが使用されます。

value がアプリケーション定義型の場合、その IConvertible 実装で provider パラメーターを使用できます。

注意 (呼び出し元)

ChangeType(Object, Type, IFormatProvider) メソッドは、列挙値を別の型に変換できます。 ただし、ソース型が列挙型の基になる型であっても、別の型を列挙値に変換することはできません。 型を列挙値に変換するには、キャスト演算子 (C#) または変換関数 (Visual Basic の場合) を使用します。 次の例は、Continent 列挙値との間の変換を示しています。

C#
using System;

public enum Continent
{
   Africa, Antarctica, Asia, Australia, Europe,
   NorthAmerica, SouthAmerica
};

public class Example
{
   public static void Main()
   {
      // Convert a Continent to a Double.
      Continent cont = Continent.NorthAmerica;
      Console.WriteLine("{0:N2}",
                        Convert.ChangeType(cont, typeof(Double)));

      // Convert a Double to a Continent.
      Double number = 6.0;
      try {
         Console.WriteLine("{0}",
                           Convert.ChangeType(number, typeof(Continent)));
      }
      catch (InvalidCastException) {
         Console.WriteLine("Cannot convert a Double to a Continent");
      }

      Console.WriteLine("{0}", (Continent) number);
   }
}
// The example displays the following output:
//       5.00
//       Cannot convert a Double to a Continent
//       SouthAmerica

ChangeType(Object, Type, IFormatProvider) メソッドは、null 許容型を別の型に変換できます。 ただし、conversionTypeNullable<T>の基になる型である場合でも、別の型を null 許容型の値に変換することはできません。 変換を実行するには、キャスト演算子 (C#) または変換関数 (Visual Basic の場合) を使用できます。 次の例は、null 許容型との間の変換を示しています。

C#
using System;

public class Example
{
   public static void Main()
   {
      int? intValue1 = 12893;
      double dValue1 = (double) Convert.ChangeType(intValue1, typeof(Double), null);
      Console.WriteLine("{0} ({1})--> {2} ({3})", intValue1, intValue1.GetType().Name,
                        dValue1, dValue1.GetType().Name);

      float fValue1 = 16.3478f;
      int? intValue2 = (int) fValue1;
      Console.WriteLine("{0} ({1})--> {2} ({3})", fValue1, fValue1.GetType().Name,
                        intValue2, intValue2.GetType().Name);
   }
}
// The example displays the following output:
//    12893 (Int32)--> 12893 (Double)
//    16.3478 (Single)--> 16 (Int32)

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

ChangeType(Object, TypeCode, IFormatProvider)

ソース:
Convert.cs
ソース:
Convert.cs
ソース:
Convert.cs

指定したオブジェクトと等価の値を持つ、指定した型のオブジェクトを返します。 パラメーターは、カルチャ固有の書式設定情報を提供します。

C#
public static object ChangeType (object value, TypeCode typeCode, IFormatProvider provider);
C#
public static object? ChangeType (object? value, TypeCode typeCode, IFormatProvider? provider);

パラメーター

value
Object

IConvertible インターフェイスを実装するオブジェクト。

typeCode
TypeCode

返すオブジェクトの型。

provider
IFormatProvider

カルチャ固有の書式設定情報を提供するオブジェクト。

戻り値

基になる型が typeCode で、その値が valueと等しいオブジェクト。

-又は-

valuenull で、typeCodeEmptyString、または Objectの場合は、null 参照 (Visual Basic でNothing)。

例外

この変換はサポートされていません。

-又は-

valuenull され、typeCode は値の型を指定します。

-又は-

value では、IConvertible インターフェイスは実装されません。

value は、providerによって認識される typeCode 型の形式ではありません。

value は、typeCode 型の範囲外の数値を表します。

typeCode が無効です。

次の例では、GetFormat メソッドがいつ呼び出され、fr-FR カルチャの NumberFormatInfo と、en-US カルチャの DateTimeFormatInfo オブジェクトを返す、InterceptProvider という名前のカスタム書式指定プロバイダーを定義します。 この形式プロバイダーは、ChangeType(Object, TypeCode, IFormatProvider) メソッドのすべての呼び出しで使用されます。 次に、DoubleDateTime 値を持つ配列を作成し、各値と TypeCode 列挙体の各メンバーで ChangeType(Object, TypeCode, IFormatProvider) を繰り返し呼び出します。 この例では、メソッドが IFormatProvider パラメーターを使用するタイミングを示し、カルチャに依存する書式設定を実行するために provider パラメーターを使用する方法も示しています。

C#
using System;
using System.Globalization;

public class InterceptProvider : IFormatProvider
{
   public object GetFormat(Type formatType)
   {
      if (formatType == typeof(NumberFormatInfo)) {
         Console.WriteLine("   Returning a fr-FR numeric format provider.");
         return new System.Globalization.CultureInfo("fr-FR").NumberFormat;
      }
      else if (formatType == typeof(DateTimeFormatInfo)) {
         Console.WriteLine("   Returning an en-US date/time format provider.");
         return new System.Globalization.CultureInfo("en-US").DateTimeFormat;
      }
      else {
         Console.WriteLine("   Requesting a format provider of {0}.", formatType.Name);
         return null;
      }
   }
}

public class Example
{
   public static void Main()
   {
      object[] values = { 103.5d, new DateTime(2010, 12, 26, 14, 34, 0) };
      IFormatProvider provider = new InterceptProvider();

      // Convert value to each of the types represented in TypeCode enum.
      foreach (object value in values)
      {
         // Iterate types in TypeCode enum.
         foreach (TypeCode enumType in ((TypeCode[]) Enum.GetValues(typeof(TypeCode))))
         {
            if (enumType == TypeCode.DBNull || enumType == TypeCode.Empty) continue;

            try {
               Console.WriteLine("{0} ({1}) --> {2} ({3}).",
                                 value, value.GetType().Name,
                                 Convert.ChangeType(value, enumType, provider),
                                 enumType.ToString());
            }
            catch (InvalidCastException) {
               Console.WriteLine("Cannot convert a {0} to a {1}",
                                 value.GetType().Name, enumType.ToString());
            }
            catch (OverflowException) {
               Console.WriteLine("Overflow: {0} is out of the range of a {1}",
                                 value, enumType.ToString());
            }
         }
         Console.WriteLine();
      }
   }
}
// The example displays the following output:
//    103.5 (Double) --> 103.5 (Object).
//    103.5 (Double) --> True (Boolean).
//    Cannot convert a Double to a Char
//    103.5 (Double) --> 104 (SByte).
//    103.5 (Double) --> 104 (Byte).
//    103.5 (Double) --> 104 (Int16).
//    103.5 (Double) --> 104 (UInt16).
//    103.5 (Double) --> 104 (Int32).
//    103.5 (Double) --> 104 (UInt32).
//    103.5 (Double) --> 104 (Int64).
//    103.5 (Double) --> 104 (UInt64).
//    103.5 (Double) --> 103.5 (Single).
//    103.5 (Double) --> 103.5 (Double).
//    103.5 (Double) --> 103.5 (Decimal).
//    Cannot convert a Double to a DateTime
//       Returning a fr-FR numeric format provider.
//    103.5 (Double) --> 103,5 (String).
//
//    12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (Object).
//    Cannot convert a DateTime to a Boolean
//    Cannot convert a DateTime to a Char
//    Cannot convert a DateTime to a SByte
//    Cannot convert a DateTime to a Byte
//    Cannot convert a DateTime to a Int16
//    Cannot convert a DateTime to a UInt16
//    Cannot convert a DateTime to a Int32
//    Cannot convert a DateTime to a UInt32
//    Cannot convert a DateTime to a Int64
//    Cannot convert a DateTime to a UInt64
//    Cannot convert a DateTime to a Single
//    Cannot convert a DateTime to a Double
//    Cannot convert a DateTime to a Decimal
//    12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (DateTime).
//       Returning an en-US date/time format provider.
//    12/26/2010 2:34:00 PM (DateTime) --> 12/26/2010 2:34:00 PM (String).

注釈

ChangeType(Object, TypeCode, IFormatProvider) は、value で指定されたオブジェクトを、typeCodeで指定された定義済みの型に変換する汎用変換メソッドです。 value パラメーターには、任意の型のオブジェクトを指定できます。 変換を成功させるには、valueIConvertible インターフェイスを実装する必要があります。これは、メソッドが適切な IConvertible メソッドの呼び出しをラップするためです。 このメソッドでは、value から typeCode への変換もサポートされている必要があります。

ChangeType(Object, TypeCode, IFormatProvider) メソッドは、カスタム型への value の変換をサポートしていません。 このような変換を実行するには、ChangeType(Object, Type, IFormatProvider) メソッドを呼び出します。

provider パラメーターは、変換の書式設定情報を提供する IFormatProvider 実装です。 このパラメーターの使用方法と使用方法は、基になる IConvertible 実装によって異なります。 value が基本データ型の場合、provider は次の変換にのみ使用されます。 null IFormatProvider 引数がこれらのメソッドに渡された場合、現在のカルチャを表す CultureInfo オブジェクトが使用されます。

  • 数値から文字列への変換、または文字列から数値への変換。 provider は、CultureInfo オブジェクト、NumberFormatInfo オブジェクト、または NumberFormatInfo オブジェクトを返すカスタム IFormatProvider 実装である必要があります。 ただし、ChangeType(Object, TypeCode, IFormatProvider) メソッドは既定の "G" 書式指定子を使用して変換を実行するため、value またはターゲットの型が符号なし整数の場合、provider パラメーターは無効です。

  • DateTime 値から文字列への変換、または文字列から DateTime 値への変換。 provider は、CultureInfo または DateTimeFormatInfo オブジェクトである必要があります。

value がアプリケーション定義型の場合、その IConvertible 実装で provider パラメーターを使用できます。

適用対象

.NET 9 およびその他のバージョン
製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0