System.Convert クラス

この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。

静的 Convert クラスには、主に .NET の基本データ型との間の変換をサポートするために使用されるメソッドが含まれています。 サポートされている基本型は、 BooleanCharSByteByteInt16Int32Int64UInt16 UInt32UInt64SingleDoubleDecimalDateTimeStringです。 さらに、 Convert クラスには、他の種類の変換をサポートするメソッドが含まれています。

基本型との間の変換

すべての基本型を他のすべての基本型に変換する変換メソッドが存在します。 ただし、特定の変換メソッドの実際の呼び出しでは、実行時の基本型の値とターゲットの基本型に応じて、5 つの結果のいずれかを生成できます。 次の 5 つの結果があります。

  • 変換なし。 これは、型からそれ自体への変換が試行されたときに発生します (たとえば、Int32型の引数を使用してConvert.ToInt32(Int32)を呼び出します)。 この場合、メソッドは元の型のインスタンスを単に返します。

  • InvalidCastException。 これは、特定の変換がサポートされていない場合に発生します。 次の変換では、 InvalidCastException がスローされます。

  • FormatException です。 これは、文字列が適切な形式ではないために、文字列値を他の基本型に変換しようとして失敗した場合に発生します。 次の変換では例外がスローされます。

    • Boolean値に変換される文字列は、Boolean.TrueStringまたはBoolean.FalseStringと等しくありません。
    • Char値に変換する文字列は、複数の文字で構成されます。
    • 任意の数値型に変換される文字列は、有効な数値として認識されません。
    • DateTimeに変換される文字列は、有効な日付と時刻の値として認識されません。
  • 変換に成功しました。 前の結果に記載されていない 2 つの異なる基本型間の変換の場合、すべての拡大変換と、データが失われないようにするすべての縮小変換は成功し、メソッドはターゲットの基本型の値を返します。

  • OverflowException。 これは、縮小変換によってデータが失われる場合に発生します。 たとえば、値が 10000 のInt32 インスタンスを Byte 型に変換しようとすると、10000 がByteデータ型の範囲外であるため、OverflowExceptionがスローされます。

数値型の変換によって有効桁数が失われた場合 (つまり、一部の最下位桁の損失) が発生した場合、例外はスローされません。 ただし、結果が特定の変換メソッドの戻り値の型で表すことができるよりも大きい場合は、例外がスローされます。

たとえば、 DoubleSingleに変換されると、精度の低下が発生する可能性がありますが、例外はスローされません。 ただし、 Double の大きさが大きすぎて Singleで表されていない場合は、オーバーフロー例外がスローされます。

10 進数以外の数値

Convert クラスには、整数値を 10 進数以外の文字列表現に変換したり、10 進数以外の数値を表す文字列を整数値に変換したりするために呼び出すことができる静的メソッドが含まれています。 これらの各変換メソッドには、数値システム、2 進数 (底 2)、8 進数 (底 8)、16 進数 (底 16)、および 10 進数 (底 10) を指定できる base 引数が含まれています。 CLS 準拠の各プリミティブ整数型を文字列に変換し、1 つは文字列を各プリミティブ整数型に変換する一連のメソッドがあります。

次の例では、 Int16.MaxValue の値を、サポートされているすべての数値形式の文字列に変換します。 次に、文字列値を Int16 値に変換します。

using System;

public class Example
{
   public static void Main()
   {
      int[] baseValues = { 2, 8, 10, 16 };
      short value = Int16.MaxValue;
      foreach (var baseValue in baseValues) {
         String s = Convert.ToString(value, baseValue);
         short value2 = Convert.ToInt16(s, baseValue);

         Console.WriteLine("{0} --> {1} (base {2}) --> {3}",
                           value, s, baseValue, value2);
      }
   }
}
// The example displays the following output:
//     32767 --> 111111111111111 (base 2) --> 32767
//     32767 --> 77777 (base 8) --> 32767
//     32767 --> 32767 (base 10) --> 32767
//     32767 --> 7fff (base 16) --> 32767
open System

let baseValues = [ 2; 8; 10; 16 ]
let value = Int16.MaxValue
for baseValue in baseValues do
    let s = Convert.ToString(value, baseValue)
    let value2 = Convert.ToInt16(s, baseValue)
    printfn $"{value} --> {s} (base {baseValue}) --> {value2}"

// The example displays the following output:
//     32767 --> 111111111111111 (base 2) --> 32767
//     32767 --> 77777 (base 8) --> 32767
//     32767 --> 32767 (base 10) --> 32767
//     32767 --> 7fff (base 16) --> 32767
Module Example2
    Public Sub Main()
        Dim baseValues() As Integer = {2, 8, 10, 16}
        Dim value As Short = Int16.MaxValue
        For Each baseValue In baseValues
            Dim s As String = Convert.ToString(value, baseValue)
            Dim value2 As Short = Convert.ToInt16(s, baseValue)

            Console.WriteLine("{0} --> {1} (base {2}) --> {3}",
                           value, s, baseValue, value2)
        Next
    End Sub
End Module
' The example displays the following output:
'     32767 --> 111111111111111 (base 2) --> 32767
'     32767 --> 77777 (base 8) --> 32767
'     32767 --> 32767 (base 10) --> 32767
'     32767 --> 7fff (base 16) --> 32767

カスタム オブジェクトから基本型への変換

Convert メソッドは、基本型間の変換をサポートするだけでなく、任意のカスタム型から任意の基本型への変換をサポートします。 これを行うには、カスタム型は、実装型を各基本型に変換するためのメソッドを定義する IConvertible インターフェイスを実装する必要があります。 特定の型でサポートされていない変換では、 InvalidCastExceptionがスローされます。

ChangeType メソッドが最初のパラメーターとしてカスタム型を渡された場合、または Convert.ToType メソッド (Convert.ToInt32(Object)Convert.ToDouble(Object, IFormatProvider) など) が呼び出され、最初のパラメーターとしてカスタム型のインスタンスが渡されると、Convert メソッドはカスタム型のIConvertible実装を呼び出して変換を実行します。 詳細については、「.NET での型変換」を参照してください。

カルチャ固有の書式設定情報

すべての基本型変換メソッドと ChangeType メソッドには、 IFormatProvider型のパラメーターを持つオーバーロードが含まれます。 たとえば、 Convert.ToBoolean メソッドには次の 2 つのオーバーロードがあります。

IFormatProvider パラメーターは、変換プロセスを支援するカルチャ固有の書式設定情報を提供できます。 ただし、ほとんどの基本型変換メソッドでは無視されます。 これは、次の基本型変換メソッドでのみ使用されます。 null IFormatProvider引数がこれらのメソッドに渡された場合、現在のカルチャを表すCultureInfo オブジェクトが使用されます。

  • 値を数値型に変換するメソッド。 IFormatProvider パラメーターは、String型とIFormatProvider型のパラメーターを持つオーバーロードによって使用されます。 また、Object型のパラメーターを持ち、オブジェクトの実行時の型がStringの場合にIFormatProviderオーバーロードによっても使用されます。

  • 値を日付と時刻に変換するメソッド。 IFormatProvider パラメーターは、String型とIFormatProvider型のパラメーターを持つオーバーロードによって使用されます。 また、Object型のパラメーターを持ち、オブジェクトの実行時の型がStringの場合にIFormatProviderオーバーロードによっても使用されます。

  • IFormatProvider パラメーターを含み、数値を文字列に、またはDateTime値を文字列に変換するConvert.ToStringオーバーロード。

ただし、 IConvertible を実装するユーザー定義型は、 IFormatProvider パラメーターを使用できます。

Base64 エンコード

Base64 エンコードは、バイナリ データを文字列に変換します。 base-64 桁のデータは、7 ビット文字のみを送信できるデータ チャネルを介して簡単に伝達できます。 Convert クラスには、base64 エンコードをサポートする次のメソッドが含まれています。一連のメソッドは、バイト配列のStringとの間の変換、または base-64 桁の文字で構成される Unicode 文字の配列との間の変換をサポートします。

  • ToBase64String: バイト配列を base64 でエンコードされた文字列に変換します。
  • ToBase64CharArray: バイト配列を base64 でエンコードされた文字配列に変換します。
  • FromBase64String: base64 でエンコードされた文字列をバイト配列に変換します。
  • FromBase64CharArray: base64 でエンコードされた文字配列をバイト配列に変換します。

その他の一般的な変換

他の .NET クラスを使用して、 Convert クラスの静的メソッドでサポートされていないいくつかの変換を実行できます。 これには以下が含まれます。

  • バイト配列への変換

    BitConverter クラスは、プリミティブ数値型 (Boolean を含む) をバイト配列に変換し、バイト配列からプリミティブ データ型に変換するメソッドを提供します。

  • 文字のエンコードとデコード

    Encoding クラスとその派生クラス (UnicodeEncodingUTF8Encoding など) は、文字配列または文字列をエンコードする (つまり、特定のエンコードでバイト配列に変換する) メソッドと、エンコードされたバイト配列をデコードする (つまり、バイト配列を UTF16 でエンコードされた Unicode 文字に変換する) メソッドを提供します。 詳細については、「.NET での Character エンコード」を参照してください。

次の例では、ToInt32ToBooleanToStringなど、Convert クラスの変換メソッドの一部を示します。

double dNumber = 23.15;

try {
    // Returns 23
    int    iNumber = System.Convert.ToInt32(dNumber);
}
catch (System.OverflowException) {
    System.Console.WriteLine(
                "Overflow in double to int conversion.");
}
// Returns True
bool   bNumber = System.Convert.ToBoolean(dNumber);

// Returns "23.15"
string strNumber = System.Convert.ToString(dNumber);

try {
    // Returns '2'
    char chrNumber = System.Convert.ToChar(strNumber[0]);
}
catch (System.ArgumentNullException) {
    System.Console.WriteLine("String is null");
}
catch (System.FormatException) {
    System.Console.WriteLine("String length is greater than 1.");
}

// System.Console.ReadLine() returns a string and it
// must be converted.
int newInteger = 0;
try {
    System.Console.WriteLine("Enter an integer:");
    newInteger = System.Convert.ToInt32(
                        System.Console.ReadLine());
}
catch (System.ArgumentNullException) {
    System.Console.WriteLine("String is null.");
}
catch (System.FormatException) {
    System.Console.WriteLine("String does not consist of an " +
                    "optional sign followed by a series of digits.");
}
catch (System.OverflowException) {
    System.Console.WriteLine(
    "Overflow in string to int conversion.");
}

System.Console.WriteLine("Your integer as a double is {0}",
                         System.Convert.ToDouble(newInteger));
let dNumber = 23.15

try
    // Returns 23
    Convert.ToInt32 dNumber
    |> ignore
with :? OverflowException ->
    printfn "Overflow in double to int conversion."
// Returns True
let bNumber = System.Convert.ToBoolean dNumber

// Returns "23.15"
let strNumber = System.Convert.ToString dNumber

try
    // Returns '2'
    System.Convert.ToChar strNumber[0]
    |> ignore
with
| :? ArgumentNullException ->
    printfn "String is null"
| :? FormatException ->
    printfn "String length is greater than 1."

// System.Console.ReadLine() returns a string and it
// must be converted.
let newInteger =
    try
        printfn "Enter an integer:"
        System.Convert.ToInt32(Console.ReadLine())
    with
    | :? ArgumentNullException ->
        printfn "String is null."
        0
    | :? FormatException ->
        printfn "String does not consist of an optional sign followed by a series of digits."
        0
    | :? OverflowException ->
        printfn "Overflow in string to int conversion."
        0

printfn $"Your integer as a double is {System.Convert.ToDouble newInteger}"
Dim dNumber As Double
dNumber = 23.15

Try
   ' Returns 23
   Dim iNumber As Integer
   iNumber = System.Convert.ToInt32(dNumber)
Catch exp As System.OverflowException
   System.Console.WriteLine("Overflow in double to int conversion.")
End Try

' Returns True
Dim bNumber As Boolean
bNumber = System.Convert.ToBoolean(dNumber)

' Returns "23.15"
Dim strNumber As String
strNumber = System.Convert.ToString(dNumber)

Try
   ' Returns '2'
   Dim chrNumber As Char
   chrNumber = System.Convert.ToChar(strNumber.Chars(1))
Catch exp As System.ArgumentNullException
   System.Console.WriteLine("String is null.")
Catch exp As System.FormatException
   System.Console.WriteLine("String length is greater than 1.")
End Try

' System.Console.ReadLine() returns a string and it
' must be converted.
Dim newInteger As Integer
newInteger = 0
Try
   System.Console.WriteLine("Enter an integer:")
   newInteger = System.Convert.ToInt32(System.Console.ReadLine())
Catch exp As System.ArgumentNullException
   System.Console.WriteLine("String is null.")
Catch exp As System.FormatException
   System.Console.WriteLine("String does not consist of an " + _
       "optional sign followed by a series of digits.")
Catch exp As System.OverflowException
   System.Console.WriteLine("Overflow in string to int conversion.")
End Try

System.Console.WriteLine("Your integer as a double is {0}", _
                         System.Convert.ToDouble(newInteger))