暗黙的・明示的な型変換
暗黙の型変換
もっとも基本的な型変換に、代入時の暗黙の型変換があります。 例えばshort→intやint→doubleなど、データの欠損や桁落ち、オーバーフローが発生しない拡大変換(widening conversion)となる場合には、暗黙の型変換を行うことができます。
明示的な型変換 (キャスト)
逆に、int→shortやdouble→intなど、データの欠損や桁落ち、オーバーフローが発生し得る縮小変換(narrowing conversion)なる場合には、暗黙の型変換を行うことはできません。
この場合、キャスト構文やCIntなどの型変換関数を使って明示的な型変換を行う必要があります。
どのような場合に拡大変換または縮小変換となるかは、以下のドキュメントでまとめられています。
オーバーフローのチェック
C#では、checked/uncheckedステートメントを使うことで整数型へのキャストの際にオーバーフローのチェックを行うかどうかを制御することができます。 checkedステートメントを使うと例外OverflowExceptionをスローするようにすることができ、uncheckedステートメントを使うとオーバーフローのチェックを行わないようにすることができます。 この点についてより詳しくは整数型のオーバーフローとチェックで解説しています。
実数型から整数型への変換 (Round, Ceiling, Floor)
float(Single)、doubleおよびdecimalから整数型へ変換する際に、Math.Round、Math.Ceiling、Math.Floorといった端数処理のメソッドと組み合わせて変換することが出来ます。 これらのメソッドの動作と使い方については数学関数 §.実数の丸め・端数処理 (Truncate, Ceiling, Floor, Round)で詳しく解説しています。
文字列への/からの変換
文字列への変換 (ToString)
基本型から文字列への変換にはToStringメソッドを使うことが出来ます。 単純な文字列化の他、書式を指定した変換も出来ます。
ToStringメソッドの引数に"D8"
や"F4"
などの書式指定文字列を指定することで桁数や数値の表記を指定して文字列化することができます。 ToStringメソッドに指定できる書式については、書式指定子で詳しく解説しています。
2進・10進・16進などの形式での文字列化については、ビット演算 §.基数を指定した数値から文字列への変換を参照してください。
文字列からの変換 (Parse, TryParse)
文字列から基本型への変換にはInt32.Parse、Double.ParseなどのParseメソッドを使うことが出来ます。
このメソッドでは、変換できない形式の場合はFormatException、変換した値が型の最大値・最小値を超える場合はOverflowExceptionがスローされます。
変換時に例外をスローさせたくない場合は、Int32.TryParse、Double.TryParseなどのTryParseメソッドを使うことが出来ます。 このメソッドは、変換できた場合はtrue、変換できなかった場合はfalseを返し、変換した値は2番目の引数(out/ByRef)に代入されます。
日付型(DateTime/DateTimeOffset)とParse・TryParseメソッドについては日時・文字列の変換と書式で詳しく解説しています。
基数を指定した変換 (Convert.ToXXX)
16進・8進・2進数形式の文字列から整数型/整数型から文字列に変換するには、Convert.ToStringメソッドおよびConvert.ToInt32などのメソッドを使うことができます。 このメソッドでは、基数として2、8、10、16のいずれかを指定することができます。 これ以外の基数を指定すると例外ArgumentExceptionがスローされます。
このメソッドでは、符号付きの数値が許可されるかどうかなどの動作が基数によって変わります。 メソッドの詳しい動作についてはビット演算 §.基数を指定した文字列から数値への変換を参照してください。
以下は、基数を指定して文字列と整数型の値を変換する例です。
バイト配列への/からの変換
基本型とバイト配列への/からの変換
BitConverter.GetBytesメソッドを用いると、基本型をバイト配列に変換することが出来ます。 逆にBitConverter.ToXXXメソッドを用いると、バイト配列から基本型に変換することが出来ます。 StreamクラスやBinaryReaderクラス・BinaryWriterクラスを使ってバイナリデータを扱う場合などにこれらのメソッドが役立ちます。
ToXXXメソッドでは、変換するバイト配列と、変換する最初のインデックスを指定する必要があります。 なお、BitConverter.ToStringメソッドは、各バイトをハイフンで連結した文字列を返します。
ただし、BitConverter.ToStringの逆の動作をするメソッド、つまりBitConverter.ToStringの出力形式と同じ文字列からバイト配列を取得するメソッドは存在しないため、自分で実装する必要があります。 また、この形式の文字列から基本型に直接変換するメソッドも用意されていないため、これも自分で実装する必要があります。
リファレンスでは明記されていませんが、結果として得られるバイト表現や変換結果は実行している環境のエンディアンなどにより変わると思われます。 現在実行している環境のエンディアンを調べるには、BitConverter.IsLittleEndianプロパティを参照します(ランタイム・システム・プラットフォームの情報 §.エンディアン)。 また、IPAddressクラスのNetworkToHostOrderメソッドを使うことで整数型の値をネットワークバイトオーダー(ビッグエンディアン)からホストバイトオーダーに、HostToNetworkOrderメソッドを使うことでホストバイトオーダーからネットワークバイトオーダーに変換することが出来ます。
BitConverterクラスのメソッドを使うことで基本型とバイト配列の相互変換を行うことができますが、独自に定義した構造体などの変換には対応していません。 構造体とバイト配列との相互変換についてはBinaryReader・BinaryWriterでの構造体の読み書きで解説しています。
このほかバイト配列に関する操作についてバイト列操作でも解説しています。
文字列とバイト配列への/からの変換
Encodingクラスを使うことで、任意の文字コードを用いて文字列とバイト配列の変換を行うことが出来ます。 GetBytesメソッドで文字列からバイト配列、GetStringメソッドでバイト配列から文字列に変換できます。
基本型間の変換
Convertクラス
Convertクラスには、基本型間の変換を行うメソッドが用意されています。 これらのメソッドによる変換の結果は、キャストによる変換や、基本型のParseメソッドやToStringメソッドを直接呼び出す場合と概ね同じであるため、直接使う機会はあまりありません。 実数型から整数型への変換では、最近接偶数への丸め(MidpointRounding.ToEven)が行われます。
メソッド | 動作 |
---|---|
ToByte | 文字列からByteへの変換 |
ToChar | 文字列からCharへの変換 |
ToInt16 | 文字列からInt16への変換 |
ToInt32 | 文字列からInt32への変換 |
ToInt64 | 文字列からInt64への変換 |
ToSByte | 文字列からSByteへの変換 |
ToUInt16 | 文字列からUInt16への変換 |
ToUInt32 | 文字列からUInt23への変換 |
ToUInt64 | 文字列からUInt64への変換 |
ToSingle | 文字列からSingleへの変換 |
ToDouble | 文字列からDoubleへの変換 |
ToDecimal | 文字列からDecimalへの変換 |
ToBoolean | 文字列からBooleanへの変換 |
ToDateTime | 文字列からDateTimeへの変換 |
ToString | 文字列からStringへの変換 |
このメソッドは、変換できない形式の場合はFormatException、変換した値が型の最大値・最小値を超える場合はOverflowException、変換が定義されていない場合(DateTimeからInt32など)はInvalidCastExceptionをスローします。
また、Convertクラスにはobjectから任意の型に変換するChangeTypeメソッドも用意されています。 このメソッドは変換後の型をTypeクラスまたはTypeCode列挙型で指定することが出来ます。 変換される型はIConvertibleインターフェイスを実装している必要があります(詳しくはユーザ定義の型変換で解説します)。 当然、変換できない型の場合には例外InvalidCastExceptionがスローされます。
以下の例は、Convertクラスのメソッドを使って基本型の型変換を行ったものです。
XmlConvertクラス
XmlConvertクラスは本来、XMLスキーマのデータ型との変換を行うために用意されてるものですが、ConvertクラスではサポートされていないGuid、TimeSpan、DateTimeOffsetと文字列との変換を行うことが出来ます。