C#の型変換を完全解説|string・int変換からParse/TryParse/Convertの使い分けまで

はじめに

C#でアプリケーションを開発していると、「文字列を数値に変換したい」「ユーザー入力をintにしたい」「object型の値を本来の型に戻したい」といった場面が頻繁にあります。こうした処理を正しく書くために欠かせないのが、C#の型変換です。

C#は型安全な言語であり、変数にはあらかじめ型が決まっています。そのため、string型の値をそのままint型として扱ったり、object型の値を無条件に具体的な型として使ったりすることはできません。

この記事では、C# 変換の基本から、stringint変換、ParseTryParseConvertの違い、実務でよく使う変換パターン、例外を避ける安全な書き方まで詳しく解説します。

1. C#の型変換とは?まず押さえるべき基本

C#の型変換とは、ある型の値を別の型の値として扱えるように変える処理のことです。

たとえば、次のような処理が型変換にあたります。

C#
string text = "123";
int number = int.Parse(text);

この例では、文字列"123"を数値の123に変換しています。

C#では型ごとに扱える値や処理が異なるため、適切な型変換を行うことで、計算・比較・保存・表示などを正しく実行できます。

1-1. 型変換が必要になる場面

C#で型変換が必要になる代表的な場面は、次のようなケースです。

ユーザーが入力した文字列を数値として計算したい場合、TextBoxやコンソール入力から取得した値は基本的にstringとして扱われます。そのため、足し算や比較を行うにはintdoubleなどに変換する必要があります。

C#
string input = "100";
int price = int.Parse(input);

また、データベースやCSV、JSON、APIから取得した値を、アプリケーション内で扱いやすい型に変換する場面も多くあります。

C#
string dateText = "2026-06-11";
DateTime date = DateTime.Parse(dateText);

さらに、画面に表示するために数値や日付を文字列へ変換する場合もあります。

C#
int score = 95;
string message = score.ToString();

このように、C# 変換は入力・計算・保存・表示のあらゆる場面で必要になります。

1-2. 値型・参照型・文字列型の違い

C#の型変換を理解するには、まず値型・参照型・文字列型の違いを押さえておく必要があります。

値型は、値そのものを保持する型です。代表的なものにintdoubledecimalboolDateTimestructなどがあります。

C#
int age = 30;
bool isActive = true;
DateTime today = DateTime.Now;

参照型は、値そのものではなく、オブジェクトへの参照を保持する型です。代表的なものにclassobjectarrayinterfaceなどがあります。

C#
object value = "Hello";
string[] names = { "Alice", "Bob" };

stringは文字列を扱う型で、参照型に分類されます。ただし、C#では非常によく使われる特別な型であり、値型のように直感的に扱える場面も多くあります。

C#
string name = "Taro";

型変換では、値型同士の変換、文字列から値型への変換、参照型から具体的な型への変換など、変換元と変換先の性質によって書き方が変わります。

1-3. 暗黙的変換と明示的変換の違い

C#の型変換には、大きく分けて暗黙的変換と明示的変換があります。

暗黙的変換は、コンパイラが安全だと判断できる場合に自動で行われる変換です。たとえば、intからlongへの変換は値の範囲が広くなるため、安全に行えます。

C#
int number = 100;
long bigNumber = number;

一方、明示的変換は、開発者が意図を明確に示して行う変換です。値が失われる可能性がある場合や、変換できない可能性がある場合に使います。

C#
double value = 123.45;
int number = (int)value;

この場合、小数部分の.45は切り捨てられ、123になります。

暗黙的変換は安全性が高い一方、明示的変換ではデータの欠落や例外に注意が必要です。

1-4. キャストと型変換メソッドの使い分け

C#では、型変換の方法としてキャストと型変換メソッドがあります。

キャストは、次のように変換先の型を丸括弧で指定します。

C#
double price = 120.5;
int result = (int)price;

一方、型変換メソッドにはParseTryParseConvertToStringなどがあります。

C#
string text = "123";
int number = int.Parse(text);

キャストは、数値型同士の変換や、参照型を具体的な型に戻す場合に使われます。

C#
object obj = "Hello";
string message = (string)obj;

一方、文字列から数値、文字列から日付、文字列からboolなどに変換する場合は、ParseTryParseを使うのが一般的です。

C#
string input = "100";
int number = int.Parse(input);

安全性を重視するなら、例外を発生させにくいTryParseを使うのが実務ではよく選ばれます。

2. C#の基本的な型変換方法

C#の型変換には複数の方法があります。基本を押さえておくと、stringintの変換だけでなく、日付・小数・真偽値・列挙型などの変換にも応用できます。

2-1. 暗黙的変換で安全に変換できるケース

暗黙的変換は、情報が失われる可能性が低い場合に自動で行われます。

C#
int number = 100;
long longNumber = number;
double doubleNumber = number;

この例では、intからlongintからdoubleへ自動的に変換されています。

intよりlongのほうが扱える整数の範囲が広いため、安全に変換できます。また、doubleは小数を扱えるため、整数を小数型に変換することも可能です。

C#
int count = 10;
double average = count;
Console.WriteLine(average); // 10

暗黙的変換はコードがシンプルになりますが、すべての型で使えるわけではありません。

2-2. 明示的キャストが必要なケース

明示的キャストは、変換によって情報が失われる可能性がある場合に必要です。

C#
double value = 123.99;
int number = (int)value;

Console.WriteLine(number); // 123

doubleからintへ変換すると、小数部分は切り捨てられます。四捨五入ではない点に注意しましょう。

また、longからintへの変換にも明示的キャストが必要です。

C#
long bigNumber = 1000;
int number = (int)bigNumber;

ただし、longの値がintの範囲を超えている場合、意図しない値になる可能性があります。

C#
long bigNumber = 9999999999;
int number = (int)bigNumber;

Console.WriteLine(number);

このようなケースでは、範囲チェックやcheckedを使うことが重要です。

C#
checked
{
long bigNumber = 9999999999;
int number = (int)bigNumber;
}

checkedを使うと、オーバーフローが発生した場合にOverflowExceptionが発生します。

2-3. キャストで発生しやすいエラー

キャストでよく発生するエラーがInvalidCastExceptionです。

C#
object value = "123";
int number = (int)value;

このコードは一見、"123"intに変換できそうに見えます。しかし、実際にはobjectの中身はstringであり、stringをキャストで直接intにすることはできません。

正しくは、まずstringとして取り出し、その後int.Parseint.TryParseを使います。

C#
object value = "123";

if (value is string text && int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

キャストは「実際の型を取り出す」ためのものであり、「文字列の内容を数値に変換する」ためのものではありません。

2-4. as演算子・is演算子・パターンマッチングによる型判定

参照型の変換では、as演算子やis演算子を使うと安全に型を判定できます。

as演算子は、変換できない場合にnullを返します。

C#
object obj = "Hello";

string text = obj as string;

if (text != null)
{
Console.WriteLine(text);
}

ただし、asは主に参照型やNullable型に使います。intのような通常の値型には直接使えません。

is演算子は、指定した型かどうかを判定します。

C#
object obj = "Hello";

if (obj is string)
{
string text = (string)obj;
Console.WriteLine(text);
}

現在のC#では、パターンマッチングを使った書き方がよく使われます。

C#
object obj = "Hello";

if (obj is string text)
{
Console.WriteLine(text);
}

この書き方なら、型判定と変数への代入を同時に行えるため、読みやすく安全です。

3. stringとintの変換方法

C# 変換の中でも特によく使うのが、stringintの変換です。ユーザー入力、CSV、フォーム、APIなどから取得した値は文字列であることが多く、それを数値として扱うには変換が必要です。

3-1. intをstringに変換する方法

intstringに変換する最も基本的な方法は、ToStringメソッドを使うことです。

C#
int number = 123;
string text = number.ToString();

Console.WriteLine(text); // 123

文字列補間を使って変換することもできます。

C#
int number = 123;
string text = $"{number}";

文字列連結でもintは自動的に文字列として扱われます。

C#
int number = 123;
string message = "値は" + number + "です";

Console.WriteLine(message); // 値は123です

表示用の文字列を作る場合は、文字列補間が読みやすくおすすめです。

C#
int score = 95;
string message = $"点数は{score}点です。";

桁区切りやゼロ埋めをしたい場合は、書式指定も使えます。

C#
int number = 1234;

Console.WriteLine(number.ToString("N0")); // 1,234
Console.WriteLine(number.ToString("D6")); // 001234

3-2. stringをintに変換する方法

stringintに変換する代表的な方法は、次の3つです。

C#
int.Parse
int.TryParse
Convert.ToInt32

それぞれ特徴が異なります。

C#
string text = "123";

int a = int.Parse(text);

bool success = int.TryParse(text, out int b);

int c = Convert.ToInt32(text);

単純に確実な数値文字列を変換するならint.Parse、ユーザー入力など失敗する可能性がある値ならint.TryParsenull0として扱いたい場合はConvert.ToInt32が候補になります。

3-3. int.Parseの使い方

int.Parseは、文字列を整数に変換するメソッドです。

C#
string text = "123";
int number = int.Parse(text);

Console.WriteLine(number); // 123

ただし、変換できない文字列を渡すと例外が発生します。

C#
string text = "abc";
int number = int.Parse(text); // FormatException

また、nullを渡すとArgumentNullExceptionが発生します。

C#
string text = null;
int number = int.Parse(text); // ArgumentNullException

数値の範囲を超えた文字列を渡すと、OverflowExceptionが発生します。

C#
string text = "999999999999999999999";
int number = int.Parse(text); // OverflowException

int.Parseは、入力値が必ず正しい数値であると保証できる場面で使うのが基本です。

3-4. int.TryParseの使い方

int.TryParseは、変換に成功したかどうかをboolで返すメソッドです。変換に成功した場合、結果はout引数に入ります。

C#
string text = "123";

if (int.TryParse(text, out int number))
{
Console.WriteLine($"変換成功: {number}");
}
else
{
Console.WriteLine("変換できませんでした");
}

TryParseは、変換に失敗しても例外を発生させません。

C#
string text = "abc";

bool result = int.TryParse(text, out int number);

Console.WriteLine(result); // False
Console.WriteLine(number); // 0

ユーザー入力のように、正しい値が入るとは限らない場合にはint.TryParseを使うのが安全です。

C#
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"年齢は{age}歳です。");
}
else
{
Console.WriteLine("数値を入力してください。");
}

3-5. Convert.ToInt32の使い方

Convert.ToInt32も、値をintに変換するメソッドです。

C#
string text = "123";
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 123

Convert.ToInt32の特徴は、nullを渡した場合に0を返すことです。

C#
string text = null;
int number = Convert.ToInt32(text);

Console.WriteLine(number); // 0

ただし、不正な文字列を渡すとFormatExceptionが発生します。

C#
string text = "abc";
int number = Convert.ToInt32(text); // FormatException

また、範囲外の値ではOverflowExceptionが発生します。

C#
string text = "999999999999999999999";
int number = Convert.ToInt32(text); // OverflowException

Convert.ToInt32は、object型やnullを含む値を扱う場面で使われることがあります。

C#
object value = "123";
int number = Convert.ToInt32(value);

ただし、ユーザー入力の検証ではTryParseのほうが安全です。

3-6. string・int変換でよくあるエラーと対処法

stringからintへの変換では、主に次のようなエラーが発生します。

数値以外の文字が含まれている場合は、FormatExceptionが発生します。

C#
int number = int.Parse("abc");

空文字の場合も変換できません。

C#
int number = int.Parse("");

小数文字列もint.Parseでは整数として変換できません。

C#
int number = int.Parse("12.3");

数値がintの範囲を超えている場合は、OverflowExceptionが発生します。

C#
int number = int.Parse("999999999999999999");

これらを避けるには、TryParseを使うのが基本です。

C#
string input = "abc";

if (!int.TryParse(input, out int number))
{
Console.WriteLine("整数として変換できません。");
}

空白が含まれる場合でも、前後の空白であれば通常は変換できます。

C#
int number = int.Parse(" 123 ");
Console.WriteLine(number); // 123

ただし、カンマや通貨記号などを含む場合は、書式指定が必要になることがあります。

C#
using System.Globalization;

string text = "1,234";

if (int.TryParse(text, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out int number))
{
Console.WriteLine(number); // 1234
}

4. Parse・TryParse・Convertの違いと使い分け

C#の型変換でよく迷うのが、ParseTryParseConvertの使い分けです。それぞれの特徴を理解すると、実務で安全で読みやすいコードを書けます。

4-1. Parseの特徴と適した場面

Parseは、文字列を指定した型に変換するメソッドです。

C#
int number = int.Parse("123");
double value = double.Parse("12.34");
DateTime date = DateTime.Parse("2026/06/11");

Parseは変換できない値が渡されると例外を発生させます。そのため、入力値が正しいと保証できる場面に向いています。

たとえば、プログラム内で固定された文字列、設定ファイルで形式が厳密に管理されている値、テストコードなどではParseを使っても問題ない場合があります。

C#
const string MaxCountText = "100";
int maxCount = int.Parse(MaxCountText);

一方、ユーザー入力や外部ファイルの値のように、不正な値が混ざる可能性がある場合には注意が必要です。

4-2. TryParseの特徴と適した場面

TryParseは、変換できるかどうかを判定しながら安全に変換できるメソッドです。

C#
if (int.TryParse("123", out int number))
{
Console.WriteLine(number);
}

失敗しても例外が発生しないため、ユーザー入力や外部データの変換に向いています。

C#
string input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
Console.WriteLine($"入力された年齢: {age}");
}
else
{
Console.WriteLine("年齢は整数で入力してください。");
}

実務では、変換に失敗する可能性がある値には基本的にTryParseを使うのがおすすめです。

4-3. Convertの特徴と適した場面

Convertクラスは、さまざまな型への変換メソッドを提供します。

C#
int number = Convert.ToInt32("123");
double value = Convert.ToDouble("12.34");
bool flag = Convert.ToBoolean("true");

Convertは、object型の値を変換するときにも使いやすいです。

C#
object value = "123";
int number = Convert.ToInt32(value);

また、nullを変換したときの挙動がParseと異なります。

C#
string text = null;

int number = Convert.ToInt32(text);

Console.WriteLine(number); // 0

この挙動は便利な場合もありますが、nullが意図せず0になることで不具合に気づきにくくなる場合もあります。nullを特別な意味として扱う場合は、事前にチェックするほうが安全です。

4-4. null・空文字・不正な文字列を変換したときの違い

int.Parseint.TryParseConvert.ToInt32では、nullや空文字、不正な文字列を渡したときの挙動が異なります。

入力値int.Parseint.TryParseConvert.ToInt32
"123"123true / 123123
null例外false / 00
""例外false / 0例外
"abc"例外false / 0例外
"999999999999"例外false / 0例外

特に重要なのは、Convert.ToInt32(null)0を返す点です。

C#
string text = null;

Console.WriteLine(Convert.ToInt32(text)); // 0

一方、int.Parse(null)は例外になります。

C#
string text = null;

Console.WriteLine(int.Parse(text)); // 例外

TryParsenullでも例外を発生させず、falseを返します。

C#
string text = null;

if (int.TryParse(text, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("変換失敗");
}

4-5. 結局どれを使うべきか?目的別の選び方

C#の型変換では、目的に応じて使い分けることが重要です。

ユーザー入力や外部データを変換するなら、基本はTryParseです。

C#
if (int.TryParse(input, out int number))
{
// 変換成功時の処理
}
else
{
// エラー表示など
}

値が必ず正しいと保証できる場合は、Parseでも問題ありません。

C#
int number = int.Parse("100");

object型やnullを含む値を扱う場合は、Convertが便利です。

C#
object value = "123";
int number = Convert.ToInt32(value);

ただし、実務で安全性を重視するなら、不正な値が入る可能性がある場所ではTryParseを優先しましょう。

5. C#でよく使う型変換パターン

C# 変換では、stringint以外にも多くの型変換が登場します。ここでは実務でよく使う変換パターンを紹介します。

5-1. stringとdouble・decimalの変換

小数を扱う場合は、doubledecimalに変換します。

C#
string text = "12.34";

double doubleValue = double.Parse(text);
decimal decimalValue = decimal.Parse(text);

安全に変換するならTryParseを使います。

C#
string text = "12.34";

if (decimal.TryParse(text, out decimal price))
{
Console.WriteLine(price);
}
else
{
Console.WriteLine("金額として変換できません。");
}

金額を扱う場合は、誤差を避けるためにdecimalを使うのが一般的です。

C#
decimal price = 100.50m;
string text = price.ToString();

小数点や桁区切りはカルチャの影響を受けます。たとえば、日本では小数点に.を使うことが一般的ですが、国や地域によっては,を使うことがあります。

C#
using System.Globalization;

string text = "12.34";

decimal value = decimal.Parse(text, CultureInfo.InvariantCulture);

外部APIやCSVなど、形式が決まっているデータではCultureInfo.InvariantCultureを使うと安定しやすくなります。

5-2. stringとboolの変換

stringboolに変換するには、bool.Parsebool.TryParseを使います。

C#
string text = "true";
bool flag = bool.Parse(text);

Console.WriteLine(flag); // True

大文字・小文字の違いは基本的に許容されます。

C#
bool a = bool.Parse("True");
bool b = bool.Parse("false");

安全に変換するならTryParseを使います。

C#
string text = "yes";

if (bool.TryParse(text, out bool result))
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("boolに変換できません。");
}

注意点として、bool.Parseで変換できるのは基本的に"true"または"false"です。"1""0""yes""no"はそのままでは変換できません。

C#
bool flag = bool.Parse("1"); // FormatException

"1"true"0"falseとして扱いたい場合は、独自に判定します。

C#
string text = "1";
bool flag = text == "1";

5-3. stringとDateTimeの変換

日付文字列をDateTimeに変換するには、DateTime.ParseDateTime.TryParseを使います。

C#
string text = "2026/06/11";
DateTime date = DateTime.Parse(text);

Console.WriteLine(date);

ユーザー入力や外部データでは、DateTime.TryParseを使うと安全です。

C#
string input = "2026/06/11";

if (DateTime.TryParse(input, out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("日付として変換できません。");
}

形式が決まっている日付文字列を変換する場合は、ParseExactTryParseExactを使います。

C#
using System.Globalization;

string text = "20260611";

DateTime date = DateTime.ParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture
);

安全に書くなら、TryParseExactが便利です。

C#
using System.Globalization;

string text = "20260611";

if (DateTime.TryParseExact(
text,
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime date))
{
Console.WriteLine(date);
}
else
{
Console.WriteLine("指定形式の日付ではありません。");
}

5-4. stringとenumの変換

列挙型に文字列を変換する場合は、Enum.ParseEnum.TryParseを使います。

C#
enum Status
{
Active,
Inactive,
Pending
}
C#
string text = "Active";
Status status = (Status)Enum.Parse(typeof(Status), text);

Console.WriteLine(status); // Active

型安全に書くなら、ジェネリック版のEnum.Parse<TEnum>Enum.TryParse<TEnum>を使います。

C#
string text = "Active";

Status status = Enum.Parse<Status>(text);

安全に変換するならEnum.TryParseがおすすめです。

C#
string text = "Active";

if (Enum.TryParse<Status>(text, out Status status))
{
Console.WriteLine(status);
}
else
{
Console.WriteLine("Statusに変換できません。");
}

大文字・小文字を無視したい場合は、引数で指定できます。

C#
string text = "active";

if (Enum.TryParse<Status>(text, ignoreCase: true, out Status status))
{
Console.WriteLine(status);
}

ただし、数値文字列が列挙型の値として変換されることもあるため、必要に応じてEnum.IsDefinedで定義済みの値か確認します。

C#
if (Enum.TryParse<Status>("999", out Status status)
&& Enum.IsDefined(typeof(Status), status))
{
Console.WriteLine(status);
}
else
{
Console.WriteLine("定義されていない値です。");
}

5-5. object型から具体的な型への変換

object型にはさまざまな型の値を代入できます。

C#
object value = "Hello";

中身がstringであることが分かっている場合は、キャストできます。

C#
object value = "Hello";
string text = (string)value;

ただし、中身が別の型だった場合はInvalidCastExceptionが発生します。

C#
object value = 123;
string text = (string)value; // InvalidCastException

安全に変換するには、パターンマッチングを使います。

C#
object value = "Hello";

if (value is string text)
{
Console.WriteLine(text);
}

数値に変換したい場合は、中身の型によって方法が変わります。

C#
object value = "123";

if (value is int number)
{
Console.WriteLine(number);
}
else if (value is string text && int.TryParse(text, out int parsed))
{
Console.WriteLine(parsed);
}

Convert.ToInt32を使うと、object型の値をまとめて変換できる場合があります。

C#
object value = "123";
int number = Convert.ToInt32(value);

ただし、不正な値では例外が発生するため注意しましょう。

5-6. Nullable型への変換

Nullable型は、値型にnullを許可する型です。

C#
int? age = null;
DateTime? birthday = null;

文字列をNullableなintに変換する場合、空文字やnullならnull、数値ならintにする書き方がよく使われます。

C#
string input = "";

int? number = int.TryParse(input, out int result)
? result
: null;

ただし、このコードは三項演算子の型推論によりエラーになる場合があります。その場合は明示的にキャストします。

C#
string input = "";

int? number = int.TryParse(input, out int result)
? result
: (int?)null;

メソッド化すると再利用しやすくなります。

C#
static int? ToNullableInt(string text)
{
return int.TryParse(text, out int value)
? value
: (int?)null;
}

日付でも同じように書けます。

C#
static DateTime? ToNullableDateTime(string text)
{
return DateTime.TryParse(text, out DateTime value)
? value
: (DateTime?)null;
}

フォームやCSVでは、未入力をnullとして扱いたい場面が多いため、Nullable型への変換は実務でよく使います。

6. 型変換で発生する例外と安全な対処法

C#の型変換では、変換元の値や変換方法によって例外が発生します。よくある例外を理解しておくと、原因を素早く特定できます。

6-1. FormatExceptionが発生する原因

FormatExceptionは、文字列の形式が変換先の型に合っていない場合に発生します。

C#
int number = int.Parse("abc");

数値に変換したいのに、文字列に英字が含まれているため例外になります。

空文字でも発生します。

C#
int number = int.Parse("");

小数文字列をintに変換しようとした場合も発生します。

C#
int number = int.Parse("12.34");

日付形式が不正な場合もFormatExceptionが発生します。

C#
DateTime date = DateTime.Parse("not date");

対処法としては、TryParseを使って変換できるか確認します。

C#
if (int.TryParse("abc", out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("整数ではありません。");
}

6-2. InvalidCastExceptionが発生する原因

InvalidCastExceptionは、キャストできない型に変換しようとした場合に発生します。

C#
object value = "123";
int number = (int)value;

このコードでは、objectの中身はstringです。stringをキャストで直接intにはできません。

正しくは、文字列として取り出してから数値変換します。

C#
object value = "123";

if (value is string text && int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

また、継承関係のない参照型同士をキャストしようとした場合にも発生します。

C#
object value = new object();
string text = (string)value; // InvalidCastException

安全に処理するには、isasを使います。

C#
object value = "Hello";

if (value is string text)
{
Console.WriteLine(text);
}

6-3. OverflowExceptionが発生する原因

OverflowExceptionは、変換先の型で表現できる範囲を超えた場合に発生します。

C#
int number = int.Parse("999999999999999999");

intが扱える範囲を超えているため、例外になります。

Convert.ToInt32でも同様です。

C#
int number = Convert.ToInt32("999999999999999999");

TryParseを使えば、範囲外の値でも例外を発生させずに判定できます。

C#
string input = "999999999999999999";

if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("intの範囲を超えています。");
}

より大きな整数を扱う必要がある場合は、longdecimalを検討します。

C#
long bigNumber = long.Parse("999999999999");

6-4. nullを変換するときの注意点

nullの変換は、使うメソッドによって挙動が変わります。

C#
string text = null;

int.Parseでは例外になります。

C#
int number = int.Parse(text);

int.TryParseではfalseが返ります。

C#
bool success = int.TryParse(text, out int number);

Convert.ToInt32では0になります。

C#
int number = Convert.ToInt32(text);

この違いは重要です。特にConvert.ToInt32(null)0になることを知らないと、本来は未入力として扱うべき値を0として処理してしまう可能性があります。

入力がnullや空文字の可能性がある場合は、事前にチェックしましょう。

C#
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("入力されていません。");
}
else if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値として正しくありません。");
}

6-5. 例外を避けるための安全な変換コード

例外を避けるには、変換前に入力値をチェックし、TryParseを使うのが基本です。

C#
static bool TryConvertToInt(string input, out int number)
{
number = 0;

if (string.IsNullOrWhiteSpace(input))
{
return false;
}

return int.TryParse(input, out number);
}

使用例は次のとおりです。

C#
string input = "123";

if (TryConvertToInt(input, out int number))
{
Console.WriteLine($"変換成功: {number}");
}
else
{
Console.WriteLine("変換失敗");
}

Nullable型で返す方法もあります。

C#
static int? ToIntOrNull(string input)
{
if (string.IsNullOrWhiteSpace(input))
{
return null;
}

return int.TryParse(input, out int number)
? number
: (int?)null;
}

このようにしておくと、呼び出し側でnullを判定できます。

C#
int? number = ToIntOrNull(input);

if (number.HasValue)
{
Console.WriteLine(number.Value);
}
else
{
Console.WriteLine("数値ではありません。");
}

7. 実務で役立つC#型変換の応用

ここからは、実務でよく登場するC#の型変換パターンを見ていきます。

7-1. ユーザー入力値を安全に数値へ変換する

ユーザー入力は、必ずしも正しい形式とは限りません。そのため、ParseではなくTryParseを使うのが基本です。

C#
Console.Write("数量を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int quantity))
{
Console.WriteLine($"数量: {quantity}");
}
else
{
Console.WriteLine("数量は整数で入力してください。");
}

負の数を許可しない場合は、変換後に範囲チェックを行います。

C#
if (int.TryParse(input, out int quantity) && quantity >= 0)
{
Console.WriteLine($"数量: {quantity}");
}
else
{
Console.WriteLine("0以上の整数を入力してください。");
}

年齢や個数、ページ番号など、業務ルールがある値は、型変換と入力検証をセットで考えましょう。

7-2. CSVやフォームの文字列データを変換する

CSVやフォームから取得した値は、多くの場合stringです。

C#
string[] row = { "1001", "Tanaka", "1980/01/01" };

int id = int.Parse(row[0]);
string name = row[1];
DateTime birthday = DateTime.Parse(row[2]);

ただし、実際のCSVには空文字や不正な値が含まれることがあります。安全に処理するなら、変換用メソッドを用意すると便利です。

C#
static int? ToNullableInt(string text)
{
return int.TryParse(text, out int value)
? value
: (int?)null;
}

static DateTime? ToNullableDateTime(string text)
{
return DateTime.TryParse(text, out DateTime value)
? value
: (DateTime?)null;
}

使用例は次のとおりです。

C#
int? id = ToNullableInt(row[0]);
DateTime? birthday = ToNullableDateTime(row[2]);

CSVの日付形式が固定されている場合は、TryParseExactを使うとより正確です。

C#
using System.Globalization;

static DateTime? ToDateTimeFromCsv(string text)
{
return DateTime.TryParseExact(
text,
"yyyy/MM/dd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out DateTime value)
? value
: (DateTime?)null;
}

7-3. APIやJSONの値を適切な型に変換する

APIやJSONでは、値の型が期待どおりでない場合があります。たとえば、本来は数値であるべき値が文字列として返されるケースです。

JSON
{
"id": "123",
"price": "1200.50",
"isActive": "true"
}

このような値を扱う場合、C#側では適切な型に変換する必要があります。

C#
string idText = "123";
string priceText = "1200.50";
string activeText = "true";

int id = int.Parse(idText);
decimal price = decimal.Parse(priceText);
bool isActive = bool.Parse(activeText);

ただし、外部APIの値は仕様変更や欠損の可能性があるため、TryParseを使うと安全です。

C#
if (!int.TryParse(idText, out int id))
{
Console.WriteLine("IDが不正です。");
}

JSONライブラリを使う場合でも、文字列として受け取った値をドメインモデルに変換する層を用意すると、コード全体の見通しが良くなります。

C#
class Product
{
public int Id { get; set; }
public decimal Price { get; set; }
}
C#
Product product = new Product
{
Id = int.TryParse(idText, out int idValue) ? idValue : 0,
Price = decimal.TryParse(priceText, out decimal priceValue) ? priceValue : 0m
};

実務では、変換失敗時に0を入れるのではなく、エラーとして扱うべきか、nullとして扱うべきかを業務要件に合わせて決めることが重要です。

7-4. LINQやコレクションで型変換する

LINQを使うと、コレクション内の値をまとめて変換できます。

C#
List<string> texts = new List<string> { "1", "2", "3" };

List<int> numbers = texts
.Select text => int.Parse(text))
.ToList();

ただし、不正な文字列が含まれると例外が発生します。

C#
List<string> texts = new List<string> { "1", "abc", "3" };

安全に変換するには、TryParseを組み合わせます。

C#
List<string> texts = new List<string> { "1", "abc", "3" };

List<int> numbers = texts
.Select(text => int.TryParse(text, out int value) ? (int?)value : null)
.Where(value => value.HasValue)
.Select(value => value.Value)
.ToList();

また、変換できない値を除外するだけなら、次のように書くこともできます。

C#
List<int> numbers = new List<int>();

foreach (string text in texts)
{
if (int.TryParse(text, out int value))
{
numbers.Add(value);
}
}

可読性を重視するなら、無理にLINQだけで書かず、foreachを使うのも良い選択です。

7-5. 独自クラスで型変換を実装する方法

独自クラスでも、型変換を実装できます。代表的な方法は、コンストラクタやファクトリメソッドを用意する方法です。

C#
class UserId
{
public int Value { get; }

public UserId(int value)
{
Value = value;
}

public static bool TryCreate(string text, out UserId userId)
{
userId = null;

if (int.TryParse(text, out int value) && value > 0)
{
userId = new UserId(value);
return true;
}

return false;
}
}

使用例は次のとおりです。

C#
if (UserId.TryCreate("123", out UserId userId))
{
Console.WriteLine(userId.Value);
}

また、暗黙的変換や明示的変換演算子を定義することもできます。

C#
class Meter
{
public double Value { get; }

public Meter(double value)
{
Value = value;
}

public static explicit operator double(Meter meter)
{
return meter.Value;
}
}

使用例です。

C#
Meter meter = new Meter(10.5);
double value = (double)meter;

ただし、独自の暗黙的変換を多用すると、どこで変換が行われているのか分かりにくくなる場合があります。実務では、可読性を優先してメソッド名で意図を表す方法もよく使われます。

C#
double value = meter.Value;

8. C#型変換のベストプラクティス

C#の型変換では、ただ変換できればよいわけではありません。安全性、可読性、保守性を考えて書くことが重要です。

8-1. 例外が起きやすい変換にはTryParseを使う

ユーザー入力や外部データなど、変換に失敗する可能性がある値にはTryParseを使いましょう。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値を入力してください。");
}

Parseを使って例外処理で制御する書き方は、通常の入力チェックには向いていません。

C#
try
{
int number = int.Parse(input);
}
catch (FormatException)
{
Console.WriteLine("数値ではありません。");
}

例外は予期しないエラーを扱うための仕組みです。変換失敗が通常起こり得る場面では、TryParseを使うほうが自然です。

8-2. nullや空文字を事前にチェックする

nullや空文字があり得る場合は、変換前にチェックしましょう。

C#
if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("入力が空です。");
}
else if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値ではありません。");
}

string.IsNullOrWhiteSpaceを使うと、null、空文字、空白だけの文字列をまとめて判定できます。

C#
string.IsNullOrWhiteSpace(null);    // true
string.IsNullOrWhiteSpace(""); // true
string.IsNullOrWhiteSpace(" "); // true

未入力と不正入力を区別したい場合は、先に空チェックを行い、その後に型変換を行うと分かりやすくなります。

8-3. 小数・日付変換ではカルチャを意識する

小数や日付の変換では、カルチャの違いに注意が必要です。

C#
decimal value = decimal.Parse("1,234.56");

カンマやピリオドの意味は、地域設定によって異なる場合があります。外部データやAPIのように形式が決まっている場合は、CultureInfo.InvariantCultureを使うと安定します。

C#
using System.Globalization;

decimal value = decimal.Parse("1234.56", CultureInfo.InvariantCulture);

日付も同様です。

C#
DateTime date = DateTime.ParseExact(
"2026-06-11",
"yyyy-MM-dd",
CultureInfo.InvariantCulture
);

画面表示ではユーザーの地域設定に合わせ、データ保存やAPI連携では固定形式を使う、という考え方が実務ではよく使われます。

8-4. 可読性を重視して変換方法を統一する

同じプロジェクト内で変換方法がバラバラだと、コードの意図が分かりにくくなります。

たとえば、ある場所ではint.Parse、別の場所ではConvert.ToInt32、さらに別の場所では独自メソッドを使っていると、失敗時の挙動が統一されません。

C#
int a = int.Parse(text);
int b = Convert.ToInt32(text);

入力値の変換にはTryParseを使う、固定値の変換にはParseを使う、null許容の変換は共通メソッドを使う、というようにルールを決めると保守しやすくなります。

C#
static int? ToNullableInt(string text)
{
return int.TryParse(text, out int value)
? value
: (int?)null;
}

共通化することで、エラーハンドリングやログ出力も一箇所にまとめやすくなります。

8-5. 初心者が避けるべき型変換の書き方

初心者がやりがちな間違いの一つは、キャストで何でも変換しようとすることです。

C#
string text = "123";
int number = (int)text;

このコードはコンパイルできません。文字列の内容を数値に変換するには、ParseTryParseを使います。

C#
int number = int.Parse(text);

また、objectに入った文字列を直接intへキャストするのも誤りです。

C#
object value = "123";
int number = (int)value;

正しくは次のように書きます。

C#
object value = "123";

if (value is string text && int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

さらに、Convert.ToInt32を何でも安全な変換方法だと思い込むのも危険です。

C#
int number = Convert.ToInt32("abc");

このコードではFormatExceptionが発生します。変換に失敗する可能性がある値には、TryParseを使いましょう。

9. C#の型変換に関するよくある質問

C#の型変換でよくある疑問を整理します。

9-1. ParseとConvertはどちらを使うべき?

文字列を数値に変換するだけなら、ParseConvertのどちらでも使える場合があります。

C#
int a = int.Parse("123");
int b = Convert.ToInt32("123");

ただし、nullを渡したときの挙動が異なります。

C#
string text = null;

int a = Convert.ToInt32(text); // 0
int b = int.Parse(text); // 例外

入力値が必ず正しい文字列であるならParsenull0として扱ってよい設計ならConvertが使えます。

ただし、ユーザー入力や外部データでは、どちらよりもTryParseを使うほうが安全です。

9-2. TryParseはなぜ安全なのか?

TryParseが安全なのは、変換に失敗しても例外を発生させず、成功・失敗をboolで返すからです。

C#
bool success = int.TryParse("abc", out int number);

この場合、successfalseになり、プログラムは異常終了しません。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}
else
{
Console.WriteLine("数値ではありません。");
}

ユーザー入力のように不正な値が普通に入り得る場面では、例外ではなく条件分岐で処理できるTryParseが適しています。

9-3. stringからintに変換できない原因は?

stringからintに変換できない主な原因は、文字列が整数として正しい形式ではないことです。

たとえば、次のような文字列はintに変換できません。

C#
"abc"
""
"12.34"
"1,234"
"999999999999999999999"

"12.34"は小数であり、intでは扱えません。小数として変換するならdoubledecimalを使います。

C#
decimal value = decimal.Parse("12.34");

"1,234"のような桁区切りを含む文字列は、NumberStylesを指定すれば変換できます。

C#
using System.Globalization;

int.TryParse(
"1,234",
NumberStyles.AllowThousands,
CultureInfo.InvariantCulture,
out int number
);

まずはTryParseで変換できるか確認するのが安全です。

9-4. キャストとConvertの違いは?

キャストは、主に型そのものを別の型として扱うために使います。

C#
double value = 123.45;
int number = (int)value;

また、object型に入っている実際の型を取り出す場合にも使います。

C#
object obj = "Hello";
string text = (string)obj;

一方、Convertは、値を指定した型に変換するためのメソッド群です。

C#
string text = "123";
int number = Convert.ToInt32(text);

重要なのは、キャストは文字列の内容を数値に変換するものではないという点です。

C#
object obj = "123";
int number = (int)obj; // エラー

この場合は、次のように変換します。

C#
object obj = "123";
int number = Convert.ToInt32(obj);

または、安全に処理するならTryParseを使います。

C#
if (obj is string text && int.TryParse(text, out int number))
{
Console.WriteLine(number);
}

9-5. nullをintに変換するとどうなる?

nullintに変換したときの結果は、使う方法によって変わります。

C#
string text = null;

int.Parseでは例外になります。

C#
int number = int.Parse(text);

int.TryParseではfalseになり、結果の値は0になります。

C#
bool success = int.TryParse(text, out int number);

Convert.ToInt32では0になります。

C#
int number = Convert.ToInt32(text);

注意すべきなのは、Convert.ToInt32(null)が例外ではなく0を返すことです。未入力を0として扱ってよい場合は便利ですが、未入力と数値の0を区別したい場合には不向きです。

その場合は、Nullable型を使うとよいでしょう。

C#
int? number = string.IsNullOrWhiteSpace(text)
? null
: int.Parse(text);

より安全にするなら、TryParseと組み合わせます。

C#
int? number = int.TryParse(text, out int value)
? value
: (int?)null;

まとめ

C#の型変換は、文字列・数値・日付・bool・enum・objectなど、さまざまな型を扱ううえで欠かせない基本知識です。

特に、stringintの変換では、int.Parseint.TryParseConvert.ToInt32の違いを理解しておくことが重要です。

Parseは、値が正しいと分かっている場合に使います。変換できない値では例外が発生します。

C#
int number = int.Parse("123");

TryParseは、変換に失敗しても例外を出さず、成功・失敗を判定できます。ユーザー入力や外部データでは基本的にTryParseを使うのがおすすめです。

C#
if (int.TryParse(input, out int number))
{
Console.WriteLine(number);
}

Convertは、object型やnullを含む値の変換で便利ですが、Convert.ToInt32(null)0になる点には注意が必要です。

C#
int number = Convert.ToInt32(value);

また、型変換ではFormatExceptionInvalidCastExceptionOverflowExceptionなどの例外が発生することがあります。例外を避けるには、TryParseを使い、nullや空文字を事前にチェックし、小数や日付ではカルチャを意識することが大切です。

C# 変換の基本を押さえておくと、入力チェック、CSV処理、API連携、JSON変換、LINQ処理など、実務のさまざまな場面で安全で読みやすいコードを書けるようになります。