ふらっと C#,C♯,C#(初心者用) Part154

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0fe3-wadS)
垢版 |
2022/02/09(水) 23:13:39.45ID:1A90hyai0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part153
https://mevius.5ch.net/test/read.cgi/tech/1639403601/
■関連スレ
C#, C♯, C#相談室 Part96
https://mevius.5ch.net/test/read.cgi/tech/1639965805/
■コードを貼る場合は↓を使いましょう。
https://ideone.com/
https://dotnetfiddle.net/
■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries/
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries/
https://referencesource.microsoft.com/
https://source.dot.net/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2022/04/18(月) 20:15:04.45ID:YFSVkBgS0
488 様 489 様 491 様
確かにおっしゃり通りですね。
ただ、状況によってはやはり例外を投げたくなることもありまして、
それをどうやって説明しようかと考えていたところ 498 様がとてもわかり易く
まとめてくださったので、よければそちらを見ていただけると嬉しいです。

492 様
なるほど!
つまり、おそらく初めからこういう目的で用意されている例外はないだろうということですね。
最初は InvalidProgramException が丁度いいかと考えていたのですが、
詳しいクラスの説明を読むとどうやら別の目的で使われる例外のようですし、
おっしゃるとおり、自分でクラスを作るのが一番のような気がしてきました。

493 様
アドバイスどうもありがとうございます。これも良いアイディアだと感じました。
意味的には一行目だけで十分だけれど、
それだけではコンパイルが通らないから二行目も書こうということですよね。
NotNullIfNotNullAttribute ならぬ ThrowExceptionIfFalseAttribute みたいなものが
Debug.Assert に付けられていて二行目がなくてもコンパイルできたらいいのにな、
なんて妄想してしまいました。
2022/04/18(月) 20:16:06.96ID:YFSVkBgS0
エラーの原因がよくわからなかったので、
やむを得ずレスアンカーを使うのを諦めました。
読みにくくて申し訳ありません。
2022/04/18(月) 20:25:50.85ID:wKhqv1yX0
まあこの手の話はあちらでも挙げられてて結局しっくりくる例外はないってことになってる
https://stackoverflow.com/questions/3313906/which-exception-should-i-throw-to-signal-an-internal-error-in-my-program
MS的には System.Diagnostics.Debug.Fail() 使えやってことなんだろうね
どうしても例外上げるなら自前でLogicErrorExceptionとかを作るのが良いと思う
2022/04/18(月) 20:28:51.38ID:0OwrwjlVM
MS自身のコードだと、throw AssertUtil.Unreachable; みたいなのはよくあるよ
Unreachable はプロパティで、UnreachableException みたいなinternalなカスタム例外をnewして返してるだけ
2022/04/18(月) 20:39:47.71ID:0OwrwjlVM
一般に、アサーション目的で投げる例外は誤ってキャッチされる可能性の低い型であれば何でもよい
その意味では>>505のようにinternalな例外を定義して使うのが望ましいだろうね
必ずしも>>505の例のようにわざわざプロパティを定義する必要はないけど、あえてそうする理由としては
・いちいち throw new UnreachableException("No way!"); みたいにメッセージ書くのは面倒
・かといって空にすると、チームによっては静的チェックで例外にはメッセージを設定しろとか言われたりして面倒
といったところだろう
2022/04/18(月) 20:39:52.66ID:YFSVkBgS0
>>504 >>505
ありがとうございます。とても勉強になります。
やはり、例外を使いたいなら自分で作る、という方針で考えたいと思います。
2022/04/18(月) 21:02:38.51ID:wKhqv1yX0
>>501
「レスアンカーがおかしいです」は4つ以上のアンカーがあると出るみたい
> 488 様 489 様 491 様
みたいなのは
≫488-489,491
のように纏めたら1アンカーと解釈されたりするので工夫したらなんとかなることもあるよ
2022/04/19(火) 18:37:13.18ID:eV3D0rVm0
>>484
ない、っちゅうか買う必要ないだろ
今の時代ググってしらべりゃC#はほとんど見つかる
俺がプログラム関係の本買ったのははるか昔Win95の時代にC++のMSDN本2冊合わせて厚さ10cmくらいあったような
それ以降1冊も買ってない
2022/04/19(火) 19:13:53.78ID:bNSjpDXdM
俺はこの類で絶対に到達しないdefaultに突入してくる不具合踏んだことあるわ。
ハードの電源ラインに特定の時間帯だけノイズはいってた。
2022/04/19(火) 19:51:58.01ID:x6ztzldE0
>>510
それはc#での話なのか?
cで低レベル制御とかならあり得るかもしれんが
ハード層が高度に抽象化されてる環境で起こるとは思えんが
2022/04/19(火) 20:00:40.81ID:4CQfli8Qa
絶対の定義によるが、普通にあるよ
俺が遭遇したのだと電源電圧下がってUSB機器がリセットされる環境
USBもの使ってる途中で逝くものだから絶対に入らないとこに入った
2022/04/19(火) 20:20:45.87ID:RBfKVTUX0
>>508
ご親切にどうもありがとうございます!
…この書き込みはエラーにならないと嬉しいなあ。

>>510-512
勉強になります。
私がやってる程度のことではハードの影響を受けることはあまりなさそうですが、
私の書いたコードなら私の脳みその影響はしっかり受けますし、
慎重になるに越したことはないですね。
今回の話とは関係ないですが、
以前 C# のパターンマッチングで x is not 1 or 2 が !(x == 1 || x == 2) とは
別の意味になることに気付かずにしばらく悩み続けて、
自分の脳みそのあてにならなさにショックを覚えました。
2022/04/20(水) 08:48:13.52ID:UWj+wPguM
>>511
俺もそう思ったんだけど、どうしてもわからなくて、現場に出張って異常データが生まれるまでずっと立たせてもらってて尻尾をつかんだんよ。
他の機械の動作音を「なんだこれうっせえ…」って思ったらデータ壊れてた。
で、UnreachableをAssertしたら発見できた感じ。
2022/04/20(水) 08:51:45.89ID:UWj+wPguM
あいたみみきたたみちむあたたおあたまたたあまちたたたいたあいたあたたたつたなあたにとあああちきのつああああいあかおたあたあなまあおかたたたたあたななむさああ
516デフォルトの名無しさん (テテンテンテン MM8f-I9Qg)
垢版 |
2022/04/20(水) 12:24:18.74ID:A0C60PKcM
俺も別の機器近くにあると仕様書にないノイズ乗った想定外のデータ来てたとかあったな
2022/04/20(水) 13:20:44.47ID:Ala17EyU0
ワッチョイ
2022/04/20(水) 16:31:15.00ID:K/ev14k4M
やっぱみんなあるんだなぁ。

>>515
これスマン、ケータイ勝手に動いてた。
2022/04/20(水) 20:25:58.97ID:acZiDRW+a
組込機器開発してたらUnreachableは(可能ならログ採って)リスタートとかするのが普通だと思ってたが…
変なデータで処理続けるとか怖すぎる
2022/04/20(水) 21:40:56.33ID:iFemtOat0
普通って何さ。
要件次第。仕様次第。
きめつけはいくない
2022/04/20(水) 22:34:36.17ID:ZQEWQpWd0
スレチ
2022/04/23(土) 18:34:06.64ID:lLj6XJfK0
話変わるけど、犬を抱いて散歩してる人って何が目的なの?犬も迷惑だと思うんだけど。
2022/04/23(土) 18:47:05.69ID:BoqTj/OO0
>>509
Web にはゴミ情報も多いんで、ある程度まとまっている本は有用だと思うよ。
2022/04/23(土) 19:28:27.35ID:W31pcfVA0
>>522
小型犬は途中で疲れちゃって歩けなくなるので
2022/04/23(土) 19:29:42.87ID:W31pcfVA0
ってここc#スレじゃん
アホかよ
526デフォルトの名無しさん (ワッチョイ 56bd-rbym)
垢版 |
2022/04/24(日) 14:39:09.56ID:sEyCiX8K0
>>401助けて下さい。考えては見たのですが沼にハマってます。

結果として重なってる矩形同士のアウトライン?外形線分の始点、終点座標にしてdxfにしたいんですが、2個の矩形の場合は2個比較しかないので出来ますが、複数ある場合の比較の仕方というかループの書き方が分かりません。再帰処理とか無限ループたるものになるんですかね?

矩形の斜めは存在しない左下0.0の点を基準に上と右に伸びる矩形のみで形成されたもので限定的なんですが...
2022/04/24(日) 15:30:02.93ID:zr61OZd6a
全ての□を4本の線に分解して、線と線の交点を求めて交点があったら1本の線を2本に分解
これで多量の線ができるから、その中点に対して□の中に含まれるかをチェックして含まれるならその線は削除
2022/04/24(日) 21:10:33.16ID:0gmsp4dS0
>>403でもアドバイスしたけど
その手の処理は主にゲームプログラミングで必須の基礎技術だから
「衝突判定 総当り」とかで検索すれば類似コード腐るほど出てくる
例えばこういうコード

var list = new List<int> { 1, 2, 3 };
for(int i = 0; i < list.Count; i++)
 for(int j = i + 1; j < list.Count; j++)
  Unko(list[i], list[j]); // なんか処理
2022/04/25(月) 23:12:35.22ID:VfVmzpJD0
ビット演算子と論理演算子は別物という認識だったのですが、オーバーロードについてはビット演算子(&、|)をオーバーロードすれば論理演算子(&&、||)も有効になるとのことでした
この2つは内部的には同じようなことをやっているんでしょうか?
2022/04/25(月) 23:29:40.07ID:tlwiDwdSd
>>529
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#11133-user-defined-conditional-logical-operators
によると、
x && y は T.false(x) ? x : T.&(x, y) と等価
x || y は T.true(x) ? x : T.|(x, y) と等価
2022/04/25(月) 23:42:52.24ID:OY+KUV8t0
ビット演算子の意味が分かってないという事なのかw
そもそもオーバーロードする意味ある?
2022/04/26(火) 00:24:31.37ID:A+s1IjyR0
どうもありがとうございました
ビット演算子の意味は分かっています
オーバーロードする意味があるかは分かりませんが、理屈を理解することは大切だと思っています
2022/04/26(火) 08:00:34.53ID:CkL0lbov0
>オーバーロードについてはビット演算子(&、|)をオーバーロードすれば論理演算子(&&、||)も有効になるとのことでした

これ、どこの情報なんだろう
2022/04/26(火) 11:10:52.60ID:dBVLM5lb0
そもそも
c#的には(&、|)がビット演算子で、(&&、||)が論理演算子だって理解は正しいのか?
ビット演算と論理演算は別物だが、ビット演算を論理演算とみなせる理由とか理解してなさそう
2022/04/26(火) 11:29:37.47ID:c8R9vZaHM
>>530の言語仕様だと、&や|は logical operator、&&や||は conditional logical operator となってるね
日本の書籍で条件論理演算子とか書いてるのはあまり見たことないけど、分かりやすくて正しい呼び方だと思う
2022/04/26(火) 11:58:06.02ID:dBVLM5lb0
つまり、(&、|)は論理演算子だってことだな
ビット演算子の定義はどうなってるのか知らんが

&&とかはショートサーキット演算(子)とか呼ばれることが多い気がする
まあ意味的には条件とか言われるよりわかりやすい気はする
537デフォルトの名無しさん (テテンテンテン MM34-8bcN)
垢版 |
2022/04/26(火) 12:13:33.97ID:r7o31+YnM
まあdocs読めで終わる話だな
2022/04/26(火) 12:14:42.01ID:vaJn7zoFa
&はビット演算に使えるからビット演算子でもあってるし、論理演算子でもあってる
&&はビット演算には使わないからビット演算子ではない。論理演算子ではある
2022/04/26(火) 12:53:41.13ID:0A8AZcPf0
翻訳の際の演算子の優先順位がネックだったりして、こういう事になってんのかね?
2022/04/26(火) 20:24:55.48ID:SD1TZuYK0
>>530
知りませんでした。面白いですね。

仮に int.false(x) が x == 0, そして int.true(x) が x == -1 と定められていれば、
0 && ... や -1 || ... の ... の部分は評価されないということですよね?

つまり、T.true(x) と !T.false(x) が同じにはならないように
T.true と T.false を定めるのが適切なケースもある、と。
541デフォルトの名無しさん (ワッチョイ 5fbd-VGkv)
垢版 |
2022/04/30(土) 15:55:10.51ID:m1dCzcg60
ラベル印刷機にむけて印刷したいです。
元はエクセルシートに文字を入れて印刷してるんですが手間なんでコードで直印刷出来たらと思います。

エクセル3行分程度のものですがどこか参考になるサイト等やあればお願いします。
2022/04/30(土) 16:10:28.65ID:0pJ/3NeQa
https://duckduckgo.com/?q=c%23+%E5%8D%B0%E5%88%B7
2022/04/30(土) 16:47:19.78ID:pnty395wd
あるフォルダ配下の使用サイズを取得したいのですが、
C/C++でやる場合はFindFirstFile/Nextを使いますが、
C#でやる場合でpinvokeより良い方法がありましたら教えて下さい
2022/04/30(土) 16:52:12.05ID:QtDBeglS0
System.IO.Directory
2022/04/30(土) 16:55:40.01ID:QtDBeglS0
途中で送っちまった
System.IO.Directoryでファイル列挙して、FileInfoで個別にサイズ取ればいいと思う
2022/04/30(土) 16:57:06.01ID:pnty395wd
>>545
ありがとうございます。調べてみます。
2022/04/30(土) 17:01:42.36ID:QtDBeglS0
System.IO.DirectoryInfo.GetFilesでFileInfoの配列取れるから、こっちの方がいいかもしれない
2022/04/30(土) 17:01:51.55ID:UlkSGa+10
>>543
dobonに.>>545そのままのサンプルがある
フォルダのサイズを取得する
https://dobon.net/vb/dotnet/file/foldersize.html
2022/04/30(土) 17:08:48.46ID:Rn5KMVQ50
System.IO.DirectoryInfo.GetFiles()/GetDirectories()は大量にファイルがある場合は時間がかかるから
.Net4以降で追加されたSystem.IO.DirectoryInfo.EnumerateFiles()/EnumerateDirectories()を推奨
2022/04/30(土) 17:15:01.96ID:Rn5KMVQ50
語弊があるな
後者でもトータルで時間がかかるのは変わらないけど
1エントリ毎に処理が戻ってくるので中断出来たり使い勝手が良い
2022/04/30(土) 17:18:25.88ID:QtDBeglS0
知識がアップデートされてないので勉強になったわ
2022/04/30(土) 17:59:15.13ID:wYb1/zTY0
test
553デフォルトの名無しさん (ワッチョイ c7ad-6Jp9)
垢版 |
2022/05/01(日) 15:32:28.03ID:ixMLKEzz0
Rxの質問なんですが

var s = new Subject<int>();
s.OnNext(1);
s.OnCompleted();
s.OnNext(2);

s.Subscribe(
x => { Console.WriteLine($"{x} is recieved"); },
(Exception ex) => { Console.WriteLine($"{ex.Message}"); },
() => { Console.WriteLine($"done!"); }
);

としたときに、OnNext(1)もOnNext(2)も表示されないのはあとからSubscribeしたからと思ってるのですが
OnComplete時のメッセージが表示されるのはなぜなのでしょうか?
2022/05/01(日) 15:36:19.91ID:94nN4BqC0
OnCompletedを呼んでるからだろ。
2022/05/02(月) 07:06:11.56ID:UmbbW6hU0
Ruby でも、WIN32OLE, COM で、Office, iTunes, Illustrator や、WMI, WshShell を使えるみたい

def print_folder_size( folder_obj )
hr = "-" * 30
puts hr, File.expand_path( folder_obj.path ) # \ を、/ に変換する

puts "#{ folder_obj.name } : #{ folder_obj.size }"
end

require 'win32ole'

fso = WIN32OLE.new( 'Scripting.FileSystemObject' )
p WIN32OLE.codepage #=> 65001, UTF-8

folders = [ "C:/Users/Owner/Documents/abc",
"C:/Users/Owner/Documents/xyz" ]

folders.each do |folder|
folder_obj = fso.GetFolder( folder )
print_folder_size( folder_obj )
end
556デフォルトの名無しさん (スップ Sd7f-TUas)
垢版 |
2022/05/02(月) 15:56:47.65ID:KyVl3u/Hd
>>555
Ruby馬鹿は死ね
2022/05/02(月) 20:09:02.84ID:V0OGcW/iM
PrintPreviewControlとPrintDocumentを使っているんだけど
PrintPreviewControlでプレビューされている結果をそのまま印刷できる事って出来ないのか?

PrintDocumentでの処理がプレビューと印刷でそれぞれ処理が走ってしまう…
2022/05/02(月) 20:17:53.84ID:NkpvUQl1a
処理でbitmapを作って、そのbitmapだけを使ってプレビューや印刷?
2022/05/02(月) 20:48:24.52ID:nadSqlqnM
見たいな感じですね
print document内でGraphicsを使って座標を指定して
文字を書いたり線を引いたりしてます
2022/05/04(水) 22:31:55.43ID:FIPACptZ0
DataGridViewでDataTableに割り当てていない時にも空行があるのですが
これなんとかならいないでしょうか?

DataSourceに指定したらレコードが表示される様にしたいです。
2022/05/04(水) 23:17:30.75ID:7711bQHg0
AllowUserToAddRows=false にすれば出ないけど、そういう話ではなく?
2022/05/05(木) 10:14:01.55ID:ShoXS+HP0
>>561
ありがとうございます!それでした!!
2022/05/05(木) 11:42:19.70ID:hnbkSlrb0
いえいえ
564デフォルトの名無しさん (ワッチョイ 5fbd-p823)
垢版 |
2022/05/06(金) 18:21:26.56ID:WzpSzG4l0
visual Studioの無料版ダウンロードして遊んでるんですが、PointF[]の中に入ってるXの値とYの値をソートしたいんですが、Xをソートして次にYをソートしたいです。
2022/05/06(金) 18:25:06.51ID:/l3VuTiCM
>>564
あなたが何をしたいのか理解不能です
もう一度入力してください
2022/05/06(金) 18:37:03.45ID:Pyn2b+Aza
どうせX優先でソートしたいってことだろ。この程度理解してやれよ
Array.Sort(aa, (a, b) =>
{
if (a.X == b.X)
return a.Y - b.Y;
return a.X - b.X;
});
みたいな感じにすればいい。ただしfloatだからこのままだとエラーになる +1 -1 0 をreturnするように
2022/05/06(金) 21:18:01.61ID:TntjE3ffd
PointFでそれはおかしいだろ
浮動小数点数同士を単純に==で比較するのは殆どの場合において誤り
2022/05/06(金) 21:30:18.36ID:NMYx4eAj0
この場合は==で問題ないように思うが。
2022/05/06(金) 21:53:53.93ID:Pyn2b+Aza
==だと例えば座標(1,1)と(1,2)のどっちが先になるか分からない
2022/05/06(金) 22:09:32.98ID:TUkwoEaL0
誤差が出るような値の比較は両辺を正規化しないとダメ
2022/05/06(金) 22:23:04.14ID:8H68TfoTa
>>569
昇順だと仮定して(1,2),(1,1)の順になる理由をあげてくれ
2022/05/06(金) 22:27:09.34ID:AMfb+Q8N0
前提が示されていない以上、別にそこまで考慮する必要なくね
丸めが必要なら、前処理しておけばいい
2022/05/06(金) 22:35:58.25ID:NMYx4eAj0
>>570
ここで言ってる「正規化」って浮動小数表現上の正規化/非正規化とは別だよな。
ふつう高級言語レベルで意識する必要はないと思うが。
2022/05/06(金) 22:36:12.23ID:Pyn2b+Aza
>>571
もちろんジャスト(1,2)と(1,1)だったら逆転しないよ・・・
(1-δ,2),(1+δ,1)のように誤差があるとき逆転する
2022/05/06(金) 22:39:13.08ID:9Z37knUna
>>574
いきなり後出し条件出されて笑う
2022/05/06(金) 22:45:04.84ID:YHAWRmCh0
つかLinqで
.OrderBy(p => p.X).ThenBy(p => p.Y)
で良いんじゃないか
2022/05/06(金) 22:54:52.86ID:YHAWRmCh0
>>574
それは1じゃないものを1と書くからそう見えるだけで
1-δ,<1+δなのだから
実際には逆転などしていないと思うんだがな
2022/05/06(金) 22:56:38.59ID:Pyn2b+Aza
floatの話なんだから後出しでもなんでもなく当たり前じゃん。そのくらい察してくれよ
2022/05/06(金) 23:10:14.04ID:/xoCkKVPa
>>578
で、それの何がまずいんだ?
表示の話とごっちゃにしてるだけだろ
2022/05/06(金) 23:23:12.31ID:vot/okCP0
誤差だろうがなんだろうが厳密なソートなら==で充分だろ
質問者がどこまで考えてるかわかんねーのにお前らが推測でグダグダ言ってたって不毛なだけ
2022/05/06(金) 23:24:19.96ID:AMfb+Q8N0
ほんとそれ
2022/05/07(土) 02:59:34.72ID:w70N7Moq0
ソートの話で炎上してるみたいだけどさ
そうっとしておいてやれよ
2022/05/07(土) 08:22:33.50ID:5zcnkXK50
差分が閾値内であればイコールでよくね?
2022/05/07(土) 08:44:25.70ID:knFaNk5Ia
>>583
それは要件次第だから判断できるのは質問者だけ
2022/05/07(土) 09:19:57.56ID:kBo/c16T0
>>583
そこに範囲を持たせてしまうと順序が逆転する可能性があるから正しいソートにならないだろ。
2022/05/07(土) 11:13:36.12ID:313oEtJ80
まーだやってんのか
質問者の聞いてるのはソートの仕方だけで、どういうデータを扱うかすら提示されてないんだから
そこに誤差ガー範囲ガーだの考慮する必要はない
2022/05/07(土) 11:59:50.21ID:w70N7Moq0
ソートの話で炎上してるみたいだけどさ
そおっとしておいてやれよ
2022/05/07(土) 12:41:21.52ID:JO0+xntF0
お。ちょっと改良したのか、そのダジャレ。w
2022/05/07(土) 15:40:54.13ID:jfGefHE20
>>582
>>587
590デフォルトの名無しさん (スップ Sd2a-uM1l)
垢版 |
2022/05/07(土) 18:18:59.39ID:yxSWV8Wsd
>>527
>>528
無事GW中に出来ました!感謝です。ありがとうございます。
2022/05/08(日) 00:36:52.25ID:19hEeZmX0
VisualStudio 2019の<Nullable>enable</Nullable> 環境で、変数のツールチップにString型の時だけ「ここではxxxはnullではありません」と表示されるんだけど
これって最新の2022では直っていたりしますか。

ttps://i.imgur.com/VK2tvtE.png

おかしいのはツールチップだけで、nullableの判定は問題ない感じ。
longとかDateTimeとか色々試したけど、String型だけで表示された。なんで。
2022/05/08(日) 00:41:15.00ID:9MG0SRykM
int?はnullにはならないから
2022/05/08(日) 01:02:19.98ID:19hEeZmX0
え、値型ってそういう事だったの と思って以下のコードで確認したら==null がtrueになっていました

int? a = null;
if(a == null) {
Debug.Print($"a is null"); // こっちになる
} else {
Debug.Print($"a=[{a}]");
}

int? がnullになっているように見えるのですが、もう少しアドバイスを頂けますでしょうか。
2022/05/08(日) 01:13:17.58ID:YmLuYmO0a
よくそんな細かいところに気づいたな
vs2022(preview)でもツールチップ表示同じ
int?はnullになるよ。?ついてたらnull許容型だから入らなかったら困る

string? a = "nullでなく文字列";
string? t(string? v) => v;
var b = t(a);
var _ = b.GetType();
ついでにこんなのだとbは絶対にnullにならないけど緑の波線つく
その程度の一次的な解析しかしてない機能だから不具合を気にしたら負けだよ
2022/05/08(日) 01:34:49.43ID:19hEeZmX0
ありがとうございます。ツールチップだからそんなものか。
と、思ったらロジックでも不明点がありました。

以下のコードでIsIntがエラーになるのですが、これもそういうものなのでしょうか。
if文で非nullチェックをしても、型としてはint?だから IsInt(int v) は呼べない。という事は分かるのですが、
string?はifで非nullチェックをすると string 扱いになるので挙動が違うのですが、これもそういうものなのでしょうか。

void IsString(string v) { };
void IsInt(int v) { };
string? a = null;
if(a!=null){
IsString(a);
}
int? b = null;
if(b!=null){
IsInt(b); // 引数 1: は 'int?' から 'int' へ変換することはできません のエラーが出る。
}

↑両方通るか、両方エラーが出るならわかるけど 値型だけエラーが出る?
2022/05/08(日) 03:01:32.74ID:9MG0SRykM
int?の正体はNullable<int>という値型
構造体はnullにはならない
まるでnullのように見せかけているだけ

int?x=null;
x.ToString();

これは一見するとヌルポだがnullじゃないのでこれは通る
nullにならない値型なのでいちいちこの場所ではnullになりませんとは言わない

x.GetType();
はヌルポになる
なぜか?
GetTypeの呼び出しはobjectへのbox化のあとに行われる
nullのように見えているだけのxはbox化されて本物のnullになる
GetTypeを呼んでるところだけ本物のnullになってるのでIDEは正確に警告を出す
2022/05/08(日) 03:42:17.44ID:9MG0SRykM
int?は値型なのでnullにはならない
なのでいくらnullチェックをしても状況が変わるわけがない
nullにならないint?のnullチェックをしたってそれはint?のままだ
Nullable<int>はNullable<int>のままだ
intからint?は暗黙に変換できる
int?からintは暗黙に変換できない
そういうことになっている
だからIsInt(x)は呼び出せない

8.0で追加された機能の名称にnull許容参照型って書いてあるだろう
Nullable<>は参照型ではなく値型だ
こいつは2.0から存在する
構文が似ているが別の体系の機能なのだ
2022/05/08(日) 04:04:06.14ID:19hEeZmX0
ありがとうございます。
2022/05/08(日) 09:32:20.59ID:wSAz/RiZ0
>>596
>int?の正体はNullable<int>という値型
>>597
>8.0で追加された機能の名称にnull許容参照型って書いてあるだろう
>Nullable<>は参照型ではなく値型だ
>こいつは2.0から存在する
>構文が似ているが別の体系の機能なのだ

混乱してきた
int?の正体はNullable<int>という値型でNullable<>は2.0から存在するが
8.0のint?は参照型で別の体系の機能なのだ???
2022/05/08(日) 09:37:05.34ID:BtCX9i6lr
日曜なのに頭使わせないでくれ
2022/05/08(日) 09:38:55.11ID:nSqurBAP0
キーボードを頭で叩くのはあなたくらいのものですよ、ジョン
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況