ブログ 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/01 raw string の空白文字 書き捨ててたコードの供養ブログ シリーズ。 今日は、C# 11 で入った生文字列(raw string literals)は、C# には珍しく、空白文字の数や並び順に影響を受けるという話。 C# と空白文字 C# は空白文字の影響を受けにくい言語仕様になっています。 主に2点。 空白の有無によって意味が変わる場所が極めて少ない 全角スペースとかが混入していても ASCII のスペースと同じ扱いをする (C# に限らず、 C 言語の影響を受けて作られた言語で、 Unico… 続きを読む 2022/11/27 Visual Studio の .NET Core 化まだー? C# 配信でちょくちょく出てくる話題の1つに 「Visual Studio (for Windows)はいまだに .NET Framework だから」 というものがあります。 もちろん、「.NET Core 化はよ」みたいな文脈です。 Visual Studio は .NET 製アプリの中でも大規模なものの1つなわけで、ドッグフーディング的な意味で早く .NET Core 化してほしいというのもありますし。 .NET Framework → .NET 5 → .NET 6 → .NE… 続きを読む 新しい投稿へ 過去の投稿へ
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/01 raw string の空白文字 書き捨ててたコードの供養ブログ シリーズ。 今日は、C# 11 で入った生文字列(raw string literals)は、C# には珍しく、空白文字の数や並び順に影響を受けるという話。 C# と空白文字 C# は空白文字の影響を受けにくい言語仕様になっています。 主に2点。 空白の有無によって意味が変わる場所が極めて少ない 全角スペースとかが混入していても ASCII のスペースと同じ扱いをする (C# に限らず、 C 言語の影響を受けて作られた言語で、 Unico… 続きを読む
2022/11/27 Visual Studio の .NET Core 化まだー? C# 配信でちょくちょく出てくる話題の1つに 「Visual Studio (for Windows)はいまだに .NET Framework だから」 というものがあります。 もちろん、「.NET Core 化はよ」みたいな文脈です。 Visual Studio は .NET 製アプリの中でも大規模なものの1つなわけで、ドッグフーディング的な意味で早く .NET Core 化してほしいというのもありますし。 .NET Framework → .NET 5 → .NET 6 → .NE… 続きを読む