C# でキーワードをできるだけ多く並べる遊び
以下のコード、有効な(エラーなくコンパイルできる) C# コードの一部です。 きっかけ Twitter でこんなのを見かけて。 Can you think of a valid C# program containing 16 keywords in a row, where at least half of them are all different?— Kirill Osenkov 🇺🇦...
View Article.NET 7 Preview 7 で、C# 11 の機能が一通りそろったみたい
久々のブログになります。 C# 11 の機能追加があるたびに YouTube 配信ではちょくちょく紹介していましたが、 こっちではかなりの久々。 そういえば去年とかは新しい Preview が出るたびに「今回はこの機能が実装されたよ」一覧くらいはブログに書いてたなと思いつつ。 まあ、今年は早い段階から「C# 11.0 の新機能」の方を埋める作業をしているので、何もしてなかったわけでもないんですが。...
View ArticleBlazor Wasm 実動作デモはじめました
昔、うちのサイトのページ内に iframe で張り付けとくような実動作デモをいろいろと Silverlight 作ってたんですが、 Silverlight のサポート終了後、移行先がなくてほったらかしになっていました。 「その時が来たら本気出す」とかいう雑なタグをつけて放置してたんですが、 そろそろ Blazor WebAssembly 化でもしてみようかという感じで数年越しに作業する気になり。...
View Article共変配列事故
またちょっと Gist に書き捨ててたコードが増えてきたので供養ブログをしばらく書いていこうかと。 (今年はまだ少な目。一人アドベントカレンダーな量にはならず。) 配列の共変性 悪名高いんですが、C# のというか、.NET の配列は共変だったりします。 // ↓.NET 的に許されていはいるものの、 items[0] = new Base();...
View ArticleVisual Studio の .NET Core 化まだー?
C# 配信でちょくちょく出てくる話題の1つに 「Visual Studio (for Windows)はいまだに .NET Framework だから」 というものがあります。 もちろん、「.NET Core 化はよ」みたいな文脈です。 Visual Studio は .NET 製アプリの中でも大規模なものの1つなわけで、ドッグフーディング的な意味で早く .NET Core...
View Articleraw string の空白文字
書き捨ててたコードの供養ブログ シリーズ。 今日は、C# 11 で入った生文字列(raw string literals)は、C# には珍しく、空白文字の数や並び順に影響を受けるという話。 C# と空白文字 C# は空白文字の影響を受けにくい言語仕様になっています。 主に2点。 空白の有無によって意味が変わる場所が極めて少ない 全角スペースとかが混入していても ASCII...
View Articlestackalloc の自然な型
今日は stackalloc T[N] と (stackalloc T[N]) に差があるとか、 (stackalloc T[N]).M() が許されるとか、 そんな感じの話。 ターゲット型推論と自然な型 C# の文法の中には、「基本的にはターゲットを見て型決定するけども、別にターゲットがなくても型決定できる」ような文法がいくつかあります。...
View Article拡張メソッドは暗黙型変換を見ない
こないだ、C# で (stackalloc T[N]).M() とか書けるという話を書いたわけですが。 その過程で出てきた「そういえばこんなのも」話をもう1個。 文字列補間の拡張メソッド呼びがちょっと変という話になります。 拡張メソッドの解決 拡張メソッドの存在意義は、 「語順を変更して、x.M().N() みたいな呼び出しができる」という点です。...
View Article未使用ジェネリック型引数で 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 Articleref 構造体のインターフェイス実装 / 型引数での使用
ref 構造体で説明しているように、 Span<T> 型など一部の型は「スタック上にないといけない」という強い制約があります。 この制約を守るため、これまで、ref 構造体は インターフェイスを実装できなかった ジェネリック型引数に使えなかった という制限が掛かっていました。 C# 13 では、この制限を緩和するため、 ジェネリック型引数に「allows ref...
View Articleインターセプター
「最近動きがあったもの」ブログをいくつか書いてて、 「続報」みたいなものも書いてるわけですが。 今日のも「まあ、去年から動く実装すでにあるんだけど」という意味では続報なものの、 今日のインターセプターはあまりうちのサイトで取り上げておらず、初めて説明を書く話。 (ライブ配信では時々話に出てるんですが。) インターセプター 今日話すインターセプターは、まあ、Source...
View Articleファーストクラスな Span 型
今日は「Span<T>、ReadOnlySpan<T> をコンパイラーで特別扱いしたい」という話。 C# 7.2 の頃、Span<T> 型が追加されて、 安全性を損なわずに unsafe コード並みにパフォーマンスのよいコードが書けるようになりました。 それ以来、.NET の標準ライブラリでもいろんな場面でSpan<T> 型が活用されています。...
View Articleジェネリック型引数の部分型推論
C# のジェネリック型引数の推論を賢くしたいという話は、issue として記録されている分に限っても5年くらい前からあります。 Champion: "Partial Type Inference" 現状の C# の型推論は割と "All or Nothing" で、 new() みたいに型全体の省略はできても、new List<>() みたいな「一部分だけ省略」ができません。 //...
View Articleオーバーロード解決優先度
今日は「負の遺産整理で消したいけども消せないメソッド対処」の話。 紆余曲折合って、現状、OverloadResolutionPriority 属性でオーバーロード解決に優先度をつけて、 優先度の高いものだけを見るようにするという案になっています。 最近のわかりやすい例だと、「パフォーマンス改善のために配列引数を ReadOnlySpan 引数に変えたい」というのをやりたいとします。...
View Articlefield, value を文脈キーワード化
C# 13 向けに検討されている機能の一つに、 「半自動プロパティ」とか「field キーワード」と呼ばれているものがあります。 元々は C# 12 向けに考えられていて、去年、うちのブログでも書いているやつです。 【C# 12 候補】半自動プロパティ 簡単におさらいすると、 プロパティの get/set アクセサー内で、field を使って バッキング...
View Articleラムダ式の引数で、型名を省略して ref, out などだけを指定
ラムダ式で、ref 引数などに対して ref x => { } みたいに書けるようにしたいという話が出ています。 ラムダ式での ref 引数、out 引数 ラムダ式は、状況が許すなら、x => { } などといったように非常に簡素に書けます。 ところが、ref や out が絡むとそうもいかなくて、型推論が効く状況でも型名を省略できません。 //...
View Articleparams コレクション
ほぼ1年ぶりの params の話。 params を配列以外のコレクションに対して使えるようにするという話ですが、 雰囲気的に C# 13 でついに 入りそうです。 なので、最近そこそこ高頻度で Language Design Meeting の議題に上がっています。 Params Collection C# Language Design Meeting November 15th, 2023...
View ArticleIList とかを IReadOnlyList とかから派生させたい
.NET が長らく抱えている「なぜ IList<T> は IReadOnlyList<T> ではないのか」問題、 .NET 9 で解消するかもしれないみたい。 ちなみに、問題を抱えるに至った原因は IReadOnlyList<T> が後付けということです。 1から作り直すのであれば、誰がどう考えても IList<T> は...
View ArticleC# 13 でのコレクション式 - 制限の緩和の話
C# 13 でのコレクション式 - 制限の緩和の話 C# 12 でコレクション式が入ったわけですが、 スケジュールの都合で「C# 12 後に改めて検討する」ということになった機能がたくさんあります。 C# 12 リリース(2023/11)直後から再検討が始まっていて、先月にはある程度まとまった計画が出ています。 [Proposal]: Collection Expressions Next...
View ArticleC# 13 でのコレクション式 - ディクショナリ式
C# 13でのコレクション式関連、量が多いのでちょっとずつ取り上げシリーズ。 [Proposal]: Collection Expressions Next (C#13 and beyond) 今日はディクショナリ式の話を。 ディクショナリ式 ← 今日はこれ 自然な型 インラインなコレクション式 コレクションに対する拡張メソッド 現状でコレクション式に対応してない型...
View ArticleExtensions (拡張型)
C# 3.0 から拡張メソッドが使えるわけですが、 もうちょっといろんな「拡張」をしたいという話が前々からあります。 例えば以下のような要求。 既存の型に静的メンバーも足したい プロパティや演算子も足したい インターフェイスの後付けもしたい 今では Extensions とか呼ばれていまして、以下の issue でトラッキング中。 Exploration: Shapes and...
View ArticleLock クラス
今日は、 .NET 9 で Lock クラスというのが入る予定で、 それに伴って C# コンパイラーにも対応が必要そうという話。 一応雰囲気的には C# 13 に入りそう。 任意のオブジェクトを lock C# はなぜか任意のオブジェクト インスタンスを使って排他制御ができます。 ロックを掛けるために以下のようなコードを書くことになります。 class MultiThreadCode {...
View Articleref/ref struct 変数を非同期メソッド中で使えるように
前回の Lock クラスの話を見てから、とりあえず以下のコードを見てほしい。 using System.Runtime.Versioning; [module: RequiresPreviewFeatures] class MultiThreadCode { private static readonly object _syncObj = new(); private static...
View Article.NET 9 の破壊的変更の1つを踏んだ話
かなりのレアケースを踏んだので酒の肴程度にその話を。 破壊的変更の内容: 浮動小数点数 → 整数の飽和変換 破壊的変更の告知ページ: Floating point-to-integer conversions are saturating 最小再現コードは以下の通り。 var x = int.MaxValue; var y = (float)x; var z = (int)y;...
View Article(没) UTF-8 文字列補間
今日のは、C# 言語機能としては否決されたものの、ほぼ同等のものがライブラリと JIT 時最適化で実現されたという話になります。 ちなみに今日のこの話は .NET 8 の頃の話で、「そういえば去年書いてなかった」ネタになります。 UTF-8 リテラルがあるなら C# 11 で UTF-8 リテラルが入って、 C# プログラム中に UTF-8 なバイト列を...
View Article(没) 数学準拠な剰余演算子
こないだにつづき、C# 言語機能としては没ネタ。 最終的な結論が「ライブラリでやれ」 → 「.NET 10 でメソッド追加を検討」です。 剰余の利用例 剰余演算(C# だと % 演算子)の用途として、 「配列の範囲内に収めるために index % array.Length する」とかがあると思います。 例えば以下のような感じ。 var table = new Table([1, 2, 3, 4,...
View ArticleUTF8 か Utf8 か
今日は C# 配信をやっててちょくちょく話題になるやつの話。 using System.Text; using System.Text.Unicode; var buffer = (stackalloc byte[3]); Utf8.FromUtf16("abc", buffer, out var r, out var w);...
View Articlefield キーワード
「Rosly の Language Feature Status にこの1・2か月で結構更新かかったね」という話題もたびたびあり、その辺りの話を。 Language Feature Status に並んでいるもののうち、いくつかは preview として現時点でもうすでに取り込まれています。 field キーワード ← 今日はこれ First-class Span...
View ArticleFirst-class な Span 型
「Rosly の Language Feature Status に並んでいるもののうち、すでに preview 提供済みのものシリーズ第2段。 field キーワード First-class Span ← 今日はこれ nameof(T<>) すでに今、LangVersion に preview を指定すれば利用可能です。 今日は First-class Span。...
View Articlenameof(T)
「Rosly の Language Feature Status に並んでいるもののうち、すでに preview 提供済みのものシリーズ第3段。 field キーワード First-class Span nameof(T<>) ← 今日はこれ すでに今、LangVersion に preview を指定すれば利用可能です。 今日は最後の1個の nameof(T<>)...
View Article文字列リテラルを data セクションに UTF-8 で書き込む案
ここ数回のブログ( その1、 その2、 その3 )、Language Feature Status に最近かかった更新のうち、すでに実装されたものの紹介をしていたわけですが。 「その Language Feature Status を見てると、何やら見慣れないものもちらほら増えてない?」みたいな話題も出ておりまして、今回からその辺りに触れていきたいと思います。 今日は「String...
View Article