Nobuyuki Iwanaga
Nobuyuki Iwanaga
https://ufcpp.net/study/csharp/cheatsheet/ap_ver14/#field-keyword https://ufcpp.net/study/csharp/oo_property.html?p=2#field-keyword
昔ちょこっと書いたの: ## 要求1: 静的メンバー C# 3.0 の拡張メソッドはインスタンス メソッドでだけ「既存の型に追加したように見える書き方」ができます。 `123.Extension()` とはできても、`int.Extension()` とはできません。 既存の型に静的メソッドを足せなくて困る例としては、ポリフィル(古い環境向けに最新機能を移植して使えるようにするような用途)とかでしょうか。 例えば割かし最近(.NET 8、2023年11月正式リリース)、[`TimeProvider`](https://learn.microsoft.com/ja-jp/dotnet/api/system.timeprovider)という型が入って以下のような書き方ができるようになりました。 TimeProvider tp = TimeProvider.System; // 1秒待つ。 // TimeProvider を差し替えて、単体テストとかでは一瞬で終わるようにしたい。 await Task.Delay(TimeSpan.FromSeconds(1), tp); `TimeProvider` クラス自体は、.NET 8 より前のランタイムでも使えるようにできます。...
13から外れた。 Unsafe.As 路線は JIT を混乱させて文字通り安全じゃないらしく、急遽路線変更。
```cs // this 形式の拡張メソッドとの互換性 // // C# 14 で作った extension ブロック形式の拡張メソッドは、 // C# 13 以前のコンパイラーからも普通に呼べる。 // // 以下のように書いた場合、 // B 側には A 側の public static void M(this int x) と全く同じメソッドが生成される。...
```cs static class Ex { /// /// aaa /// /// iii public static void M(this string s) { } // ここに doc コメント書く想定あるはずだけど、現時点、VS では反映されなさそう。 // (利用側で "".M1 のヒント見ても s の説明が出ない。)...
```cs // 修飾子とか属性とか盛る using System.Diagnostics.CodeAnalysis; class AAttribute : Attribute; struct S; static class Ex { extension([NotNull][A] scoped ref S? x) where TKey : notnull, IComparable where TValue : unmanaged, IUtf8SpanFormattable...
```cs // 残念仕様。 static class Ex { extension(T x) { public void M() { } } /* * ↓ みたいなコードに展開される。 * x.M(); で型推論できない。x.M(); みたいに2個とも型引数指定必要。 public static void M(this T x)...
```cs static class A { extension(int x) { public void M() { } } extension(int x) { // 同じ型に対する extension は同一グループ扱いで、名前が被るとコンパイル エラー。 public void M() { } } } static...
Ex.get_Property とか Ex.op_Plus とかでも呼べる。
```cs var e = IEnumerable.M(out object o); // What type is e? Does this line compile? public static class Ext { extension(IEnumerable) { public static IEnumerable M(out T t) =>...