未使用ジェネリック型引数で TypeLoadException が起こる問題
今日は C# の構造体がらみで、 できそうでできない、 できてもいいはずだけど直されない、 コンパイルまでは通るのに実行時にエラーになってしまう制限の話。 入れ子の構造体 C# で、構造体の中にその構造体自身のフィールドを持つことはできません。 レイアウトの決定が無限再帰を起こすので、これはダメで当然。 struct S { S _nested; } これはそもそもコンパイル エラーになります。...
View ArticleUnsafe クラスの敗北 (関数ポインター)
Gist に書き捨ててたコードの供養ブログ シリーズ、 今日のは特に人を選ぶやつ。 今日は C# 9 で入った 関数ポインター がらみの話です。 Unsafe クラス C# の unsafe 機能、例えばポインターとかは、なかなか制限がきついです。 そのため、「実は .NET の型システム的にはできる」というものでも、 C# で書くことはできないことが結構あります。 それに対して、 .NET...
View Article必ず、かの邪知暴虐の T4 を除かねばならぬと決意した
個人的に、前々から「T4 は将来性が見えなさ過ぎてもう使うのやめたい」と言い続けていたわけですが、 最近ようやく自分が保守している T4 を全部別の手段で書き換えたので、 今日はそれの話。 T4 (Text Template Transformation Toolkit) テキスト テンプレートというと、ひな形的なテキストを簡易な文法で生成するようなものです。 例えば、 public static...
View ArticleJSON とかの中身確認ツール
今日は、「主に自分が使う用ツールを Blazor WebAssembly で作って Static Web Apps に置いたよ」系の話を一応ブログ化。 ソースコード Static Web App よくある「JSON とかのデータの中身を確認するツール」です。 しばらく、JSON と MessagePack の読み書きをするコードを書いてて、 デバッグがしんどくなって作ったのがこのツール。...
View Article【C# 12 候補】ラムダ式のデフォルト引数と params 引数
そろそろ、C# vNext 候補で上がってるものをちらほら紹介していこうかと。 今日は割かし確度高そうなものとして、ラムダ式がらみの話。 ラムダ式でもデフォルト引数と params への対応を考えているそうです。 提案ドキュメント: Optional and parameter array parameters for lambdas and method groups C# 10 のときの話...
View Article【C# 12 候補】IEnumerable 向けリスト パターン
C# vNext (12 候補)紹介シリーズ。 今日はリスト パターンがらみ。 提案ドキュメント: List patterns on enumerables (この当時から、リスト パターンの文法には結構変更あり) 直近の Language Design Meeting ノート C# 11 のときの話 C# 11 でリスト パターンが入りました。 is [] みたいに、[] を使って配列とか...
View Article【C# 12 候補】半自動プロパティ
今日は半自動プロパティの話。 提案 issue: Proposal: Semi-Auto-Properties; field keyword #140 約1年前にも書いてる通り、場合によっては C# 11 で入っていたかもしれないものです。 需要はそれなりに高いんですが、 案外課題があって結局スケジュール的に11からははずれ、「その後どうなったの?」とか思われていそうな機能です。...
View Articleusing alias を任意の型に対応
今日は using alias の話。 提案: Allow using alias directive to reference any kind of Type これはちらほら実装が始まっているので近々触れるものが出てくるんじゃないでしょうか。 既存の using ディレクティブ using alias は、using ディレクティブを書くときに using T =...
View Article【C# 12 候補】コレクション リテラル
今回はコレクション リテラルの話。 ・提案 issue: [Proposal]: Collection literals #5354 今日の話も、提案自体は去年から結構前向きに検討されてたものです。 リスト パターンの実装の過程で出てきた案で、元から「C# 11 には間に合わないかも」みたいな空気感だったもの。 昨年11月に C# 11...
View Article【C# 12 候補】params Span、改め、params ReadOnlySpan
今回は params の話。 Working Group 議事録 2022/10/25 2022/11/3 params の改善話は紆余曲折ありまして。 去年の時点では params Span<T> で検討されていました。 ちょこっとだけマイナーチェンジされまして、現在は params ReadOnlySpan<T> です。 いろんな型で params 案(没) 現在の...
View Article【C# 12 候補】 Extensions
今日は「拡張」(拡張メソッド的なものの改良)の話。 (今日のこれは、C# 12 で全て実装されるかどうか怪しく、 一部 13 以降になる可能性も結構高いです。) 提案ドキュメント: Extension types Working Group 議事録 2022/11/10 2023/1/23 2023/1/25 2023/2/15 結構昔から、 Extension everything:...
View ArticleC# での破壊的変更の今後の扱い(案)
C# は、進化していくにあたって、破壊的変更を極力起こさないようにかなり気を使っているプログラミング言語です。 細かい話をすると破壊的変更も皆無ではないんですが、 破壊的変更を認める(認めてでも追加したい新機能を実装する)ハードルは結構高めです。 そんな C# ですが、ちょっとそのハードルの基準を緩められないかというような話が出ています。 Dealing with limited breaking...
View Article忘れがちなカルチャー依存問題
今日は、「Globalization Invariant Mode」に変更したら、意外と忘れがちなところで差が出たみたいな話。 Globalization Invariant Mode 以前に1回ブログに書いてるんですが、 .NET の文字列 API にはカルチャー依存なものが多くて、 例えば 1.2.ToString() すらカルチャー依存です。 大陸ヨーロッパだと小数点を ,...
View Article.NET の文字列比較でカルチャー未指定を検知する
先日の C# 配信で、 「これはブログに書いておくと助かる人がいるんじゃないか」と言われたものをブログ化。 背景: カルチャー依存問題再び うちのブログでも何回か書いてるんですが、 .NET の文字列比較は、カルチャー依存比較するものと Ordinal (文字コード通り)比較するものが混在していて、なかなかにやばいです。 .NET のカルチャー依存 API 問題 忘れがちなカルチャー依存問題...
View Articleモジュール初期化子が呼ばれる順
前回のブログに続き、 先日の C# 配信で出てたネタ。 まあ、今回のは知ったところで誰が助かるということもないようなトリビア的な話です。 後だし優先で上書き その C# 配信内で、 「CultureInfo.DefaultThreadCurrentCulture を上書きすれば対処はできるけども」 みたいな話が出まして。...
View ArticleLength-based switch dispatch
「そういやブログに書いてなかった」ネタ。 Pull Request が通った プレビュー版(Visual Studio 16.6 Preview 1)でよければ今年の2月頃から使えてた話です。 文字列に対する switch に新しい最適化手法が導入されました。 元々の switch のコスト 例として以下のような switch を考えます。 static int...
View ArticleC# 13 向けトリアージ
.NET 8 も RC 2 な段階になって、ここから GA までの間に仕様が変わるということはほとんどなくなってきました。 となると、話題はもうその次。来年向け(C# 13 / .NET 9 ターゲット)の話が出てきます。 C# Design Meeting でも、13向けのトリアージがちらほら始まりました。 とりあえず現状、2件。 LDM Notes for October 9th, 2023...
View Article\e (エスケープ文字のエスケープ シーケンス)
先々月書いた「C# 13 向けトリアージ」で紹介してた C# 13 候補の1つ、「\e エスケープ シーケンス」が早々に実装されてたという話です。 .NET 8 正式リリース記念の配信ではちょこっと触れてたんですが、そういえばブログには書いてなかったので紹介。 エスケープ文字 キーボードで打てないような文字や、画面に表示されない文字を入力したりするために、 「\n と書いたら改行(U+000A,...
View Articleオブジェクト初期化子中の ^ 演算子
今日の C# 話はちょこっとした修正の話になります。 これまで new C { [^1] = 1 }; がコンパイル通らなかったみたいで、これが最近修正されました。 (Visual Studio 17.9 Preview 3 (1月17日リリース済み)の時点で実装されていました。 気づいてはいたけども、小さすぎてブログにするかどうか迷ってるうちに3週間ほど経過。)...
View ArticleC# での破壊的変更の今後の扱い (続報)
去年の3月にブログに書いたものの続報。 C# でも限定的に破壊的変更を許していこうかという話だったわけですが、 ちょっと具体化しました。 ある機能を実現するにあたって破壊的変更の原則と進め方についての話をしています。 破壊的変更の候補 C# 13 で導入したい field アクセス(自動プロパティのバッキングフィールドにアクセスするための field キーワード)と、...
View Article