Console.ReadLine()!; の「!」は何ですか?

タグの編集
投稿者 mu  (社会人) 投稿日時 2024/5/8 07:53:44
C#初級講座第4回に登場する
Console.Write("1つ目の数字: ");
string value1 = Console.ReadLine()!;
の「!」はどんな機能ですか?

また、書籍で、textSetTimeというプロパティ名のテキストボックスに整数を入れてボタンをクリックするとtextRemainingTimeというテキストボックスに同じ整数が入った後1ずつ減っていき終了するタイマーの基本機能を学習するwindowsフォームアプリのソースコードに
if (!int.TryParse(textSetTime.Text, out endTime))
{
       endTime = 1;
}
とあり、また「!int」の意味が分かりません。
どなたかよろしくお願いします。
投稿者 とくま  (社会人) 投稿日時 2024/5/8 08:17:10
>string value1 = Console.ReadLine()!;
>の「!」はどんな機能ですか?
同じページの
2-4.null ではない!
に解説されています。


>とあり、また「!int」の意味が分かりません。
否定の not を表します。
【論理演算子】
https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/boolean-logical-operators
よく使うので、算術演算子の次に覚えておきたい内容です。


ニュアンスは違いますが、どちらも否定する意味を持っています。後者のほうをよく使います。
投稿者 mu  (社会人) 投稿日時 2024/5/8 08:45:26
ご回答ありがとうございます。
1個目の方は、ご指摘の部分を読み、なんとなくわかったようなわからないような感じですが、一応わかりました。
2個目の方は、頭を整理してよく考えれば明日くらいには分かる気がします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2024/5/10 19:19:38
> 同じページの
> 2-4.null ではない!
> に解説されています。

後置き「!」演算子は、null 許容性判定を無視して、常に 非 null 扱いにするための物です。
null 寛大演算子とか、null 抑止演算子と呼ばれることもあります。

先の解説では
> ReadLine() の後ろについている ! は、「値が必ず存在することにする」という目印です。
> ! をつけて「ここは必ず値が入っている」ということをコンパイラーに伝えてこの警告を消します。
とありますが、実際には値が入っているのだと伝えているわけではなく、どちらかといえば
null かどうかをチェックするのを止めさせる、というニュアンスです。


#nullable enable
string? a = null ;  // 代入先が null を許容しているため、null を入れても問題無し
string  b = null ;  // 代入先が null 非許容なので、null の代入が警告される[CS8600]
string  c = null!;  // 代入先は null 非許容だが、後置 ! 演算子があるので null 検査は行われない
#nullable restore



> なお、ユーザーが何も入力せずに Enterキーを押した場合、空の文字列、つまり長さ0の文字列を取得することになりますが、これはC#の考え方では値がある状態です。

なお、Ctlr+Z を入力してから Enter キーを押した場合は、
「長さ 0 の文字列」ではなく「null」が返されます。