ブログ 2022/12/20 必ず、かの邪知暴虐の T4 を除かねばならぬと決意した 個人的に、前々から「T4 は将来性が見えなさ過ぎてもう使うのやめたい」と言い続けていたわけですが、 最近ようやく自分が保守している T4 を全部別の手段で書き換えたので、 今日はそれの話。 T4 (Text Template Transformation Toolkit) テキスト テンプレートというと、ひな形的なテキストを簡易な文法で生成するようなものです。 例えば、 public static bool TryParse(this string s, out {{T}} x)… 続きを読む 2022/12/18 Unsafe クラスの敗北 (関数ポインター) Gist に書き捨ててたコードの供養ブログ シリーズ、 今日のは特に人を選ぶやつ。 今日は C# 9 で入った 関数ポインター がらみの話です。 Unsafe クラス C# の unsafe 機能、例えばポインターとかは、なかなか制限がきついです。 そのため、「実は .NET の型システム的にはできる」というものでも、 C# で書くことはできないことが結構あります。 それに対して、 .NET Core 以降、 Unsafe (System.Runtime.CompilerSer… 続きを読む 2022/12/11 未使用ジェネリック型引数で TypeLoadException が起こる問題 今日は C# の構造体がらみで、 できそうでできない、 できてもいいはずだけど直されない、 コンパイルまでは通るのに実行時にエラーになってしまう制限の話。 ※(2023/8/3追記) .NET 8 で直るそうです。 入れ子の構造体 C# で、構造体の中にその構造体自身のフィールドを持つことはできません。 レイアウトの決定が無限再帰を起こすので、これはダメで当然。 struct S { S _nested; } これはそもそもコンパイル エラーになります。 当然。 使… 続きを読む 2022/12/08 拡張メソッドは暗黙型変換を見ない こないだ、C# で (stackalloc T[N]).M() とか書けるという話を書いたわけですが。 その過程で出てきた「そういえばこんなのも」話をもう1個。 文字列補間の拡張メソッド呼びがちょっと変という話になります。 拡張メソッドの解決 拡張メソッドの存在意義は、 「語順を変更して、x.M().N() みたいな呼び出しができる」という点です。 ほとんどの場合は本当に「語順」だけの問題で、通常のメソッド呼び出しの形でも同じコードが書けます。 // 拡張メソッド呼び。 1.… 続きを読む 2022/12/05 stackalloc の自然な型 今日は stackalloc T[N] と (stackalloc T[N]) に差があるとか、 (stackalloc T[N]).M() が許されるとか、 そんな感じの話。 ターゲット型推論と自然な型 C# の文法の中には、「基本的にはターゲットを見て型決定するけども、別にターゲットがなくても型決定できる」ような文法がいくつかあります。 例えば整数リテラルがそうなんですが、以下のように、ターゲット(左辺)の型が決まっていても決まっていなくても大丈夫です。 // ターゲット(… 続きを読む 新しい投稿へ 過去の投稿へ
2022/12/20 必ず、かの邪知暴虐の T4 を除かねばならぬと決意した 個人的に、前々から「T4 は将来性が見えなさ過ぎてもう使うのやめたい」と言い続けていたわけですが、 最近ようやく自分が保守している T4 を全部別の手段で書き換えたので、 今日はそれの話。 T4 (Text Template Transformation Toolkit) テキスト テンプレートというと、ひな形的なテキストを簡易な文法で生成するようなものです。 例えば、 public static bool TryParse(this string s, out {{T}} x)… 続きを読む
2022/12/18 Unsafe クラスの敗北 (関数ポインター) Gist に書き捨ててたコードの供養ブログ シリーズ、 今日のは特に人を選ぶやつ。 今日は C# 9 で入った 関数ポインター がらみの話です。 Unsafe クラス C# の unsafe 機能、例えばポインターとかは、なかなか制限がきついです。 そのため、「実は .NET の型システム的にはできる」というものでも、 C# で書くことはできないことが結構あります。 それに対して、 .NET Core 以降、 Unsafe (System.Runtime.CompilerSer… 続きを読む
2022/12/11 未使用ジェネリック型引数で TypeLoadException が起こる問題 今日は C# の構造体がらみで、 できそうでできない、 できてもいいはずだけど直されない、 コンパイルまでは通るのに実行時にエラーになってしまう制限の話。 ※(2023/8/3追記) .NET 8 で直るそうです。 入れ子の構造体 C# で、構造体の中にその構造体自身のフィールドを持つことはできません。 レイアウトの決定が無限再帰を起こすので、これはダメで当然。 struct S { S _nested; } これはそもそもコンパイル エラーになります。 当然。 使… 続きを読む
2022/12/08 拡張メソッドは暗黙型変換を見ない こないだ、C# で (stackalloc T[N]).M() とか書けるという話を書いたわけですが。 その過程で出てきた「そういえばこんなのも」話をもう1個。 文字列補間の拡張メソッド呼びがちょっと変という話になります。 拡張メソッドの解決 拡張メソッドの存在意義は、 「語順を変更して、x.M().N() みたいな呼び出しができる」という点です。 ほとんどの場合は本当に「語順」だけの問題で、通常のメソッド呼び出しの形でも同じコードが書けます。 // 拡張メソッド呼び。 1.… 続きを読む
2022/12/05 stackalloc の自然な型 今日は stackalloc T[N] と (stackalloc T[N]) に差があるとか、 (stackalloc T[N]).M() が許されるとか、 そんな感じの話。 ターゲット型推論と自然な型 C# の文法の中には、「基本的にはターゲットを見て型決定するけども、別にターゲットがなくても型決定できる」ような文法がいくつかあります。 例えば整数リテラルがそうなんですが、以下のように、ターゲット(左辺)の型が決まっていても決まっていなくても大丈夫です。 // ターゲット(… 続きを読む