ref 構造体のインターフェイス実装 / 型引数での使用
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 Article