質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

4829閲覧

C#でCS8604: 'int int.Parse(string s)' 内のパラメーター 's' に Null 参照引数がある可能性があります。の解決方法

bokudao

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/09/03 17:39

昨日C#を勉強し始めた初心者です。
C#で入力を求めて
入力された数値をそのまま表示するプログラムを作っています。

該当のソースコード

C#

1using System; 2 3namespace asdf 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 int num = int.Parse(Console.ReadLine()); 10 } 11 } 12} 13

実現したいこと

int num = int.Parse(Console.ReadLine());で出てくるこの警告を解決する方法を教えて下さい。

CS8604: 'int int.Parse(string s)' 内のパラメーター 's' に Null 参照引数がある可能性があります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/09/04 00:06

質問する際は開発環境 (Visual Studio, .NET のバージョン) を書きましょう。 Visual Studio 2022, .NET 6.0 以外では話が違ってくるはずです。
guest

回答1

0

ベストアンサー

失礼しました。回答が間違っていたので、打ち消し線で訂正します。

CS8604: 'int int.Parse(string s)' 内のパラメーター 's' に Null 参照引数がある可能性があります。

Console.ReadLineはnullを返す可能性があるので、コンパイラが警告を出しています。これはC#8.0でNullReferenceException発生を回避するために追加された機能です。

Console.ReadLine メソッド (System) | Microsoft Docs

入力ストリームの次の行。または次の行がない場合は null。

Console.ReadLineの戻り値をnull 許容参照型の変数に格納すれば、nullの許容をコンパイラに明示でき、警告は出力されなくなります。

Console.ReadLine呼び出しでの警告を抑制してもint.Parse(s)で警告が出力される (int.Parseはnullを許容しない) ので、この方法では解決できません。

c#

1string? s = Console.ReadLine(); 2int num = int.Parse(s);

null 許容参照型 | Microsoft Docs

null 許容参照型は、null 許容値型と同じ構文を使用して記述し、変数の型の後に ? を追加します。 たとえば、次の変数宣言は、null 許容型の文字列変数 name を表します。

string? name;

またはvarで宣言し、暗黙的に型指定された変数にしてもよいです。

こちらも同様に解決できません。

c#

1var s = Console.ReadLine(); 2int num = int.Parse(s);

ただし、暗黙的に型指定されたローカル変数 (var を使用して宣言) は、null 許容参照型です。 前のセクションで示した通り、スタティック分析によってローカル変数の "null 状態" が決定され、それが "null の可能性あり" かどうかが決定されます。

ご質問とは関係ありませんが、入力を数値に変換できるとは限らない('a'などが入力されるかもしれない)ので、ParseではなくTryParseを使ってください。

Int32.TryParse メソッド (System) | Microsoft Docs

TryParseで解決できます。Zuishinさんのコメントをご覧ください。

投稿2022/09/03 21:31

編集2022/09/03 23:42
jhashimoto

総合スコア838

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/09/03 22:10 編集

> Console.ReadLineの戻り値をnull 許容参照型の変数に格納すれば、nullの許容をコンパイラに明示でき、警告は出力されなくなります。 出力されるはずです。if (s is not null) num = int.Parse(s); のように null を排除すれば出なくなります。 > ご質問とは関係ありませんが、入力を数値に変換できるとは限らない('a'などが入力されるかもしれない)ので、ParseではなくTryParseを使ってください。 関係ないどころか、TryParse は null を許容するのでこれで解決します。 次がサンプルです。 if (!int.TryParse(Console.ReadLine(), out int num)) { // Console.ReadLine() の戻り値が数値に直せなかった場合の処理をここに書く。 // たとえば num = 0; などのようにデフォルト値を入力したり、エラーメッセージを表示して以降の処理を中断するなど。 } // 直せた場合、ここで num が使える
jhashimoto

2022/09/03 23:12

> 出力されるはずです。if (s is not null) num = int.Parse(s); のように null を排除すれば出なくなります。 出力されますね。見落としてました。 > 関係ないどころか、TryParse は null を許容するのでこれで解決します。 ご指摘のとおりでした。 回答を訂正しました。ありがとうございました。
bokudao

2022/09/03 23:35

解決しました!皆さん適切なご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問