csharp / expert
Snippet
Statische abstrakte Interface-Member
C# 11 hat statische abstrakte Member in Interfaces eingeführt, was 'Generische Mathematik' ermöglicht. Dies erlaubt es Entwicklern, statische Eigenschaften oder Operatoren zu definieren, die vom implementierenden Typ umgesetzt werden müssen. Es löst die langjährige Einschränkung, dass generische Typen keine Arithmetik durchführen oder auf statische Factory-Methoden zugreifen konnten, ohne komplexe Workarounds oder Reflexion.
snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public interface IMonoid<T> where T : IMonoid<T>{static abstract T Identity { get; }static abstract T operator +(T left, T right);}public readonly record struct Sum(int Value) : IMonoid<Sum>{public static Sum Identity => new(0);public static Sum operator +(Sum left, Sum right) => new(left.Value + right.Value);}public static class Aggregator{public static T Accumulate<T>(IEnumerable<T> items) where T : IMonoid<T>{T result = T.Identity;foreach (var item in items) result += item;return result;}}
Erklärung
1
static abstract T Identity { get; }
Deklariert einen statischen Vertrag, dass implementierende Typen eine statische 'Identity'-Eigenschaft bereitstellen müssen.
2
T result = T.Identity;
Greift direkt über den Typparameter T auf den statischen Member zu, was zuvor in C# unmöglich war.