Einführung:
Diskriminierte Gewerkschaften, auch bekannt als getaggte Gewerkschaften oder disjunkte Gewerkschaften, sind eine Programmierkonstrukt, das die Speicherung verschiedener Datentypen in einer einzigen Variablen ermöglicht. Sie bieten eine typsichere Möglichkeit, eine Reihe von Werten mit einer begrenzten Anzahl von Varianten darzustellen.
Das Problem verstehen:
Die Frage schlägt eine Union-Klasse in C# vor um eine ähnliche Funktionalität wie die Union im C-Stil bereitzustellen. Der Klasse fehlt jedoch die vom Compiler erzwungene Typprüfung, wenn die Funktionen „Is“ und „As“ verwendet werden. Das Problem tritt auf, wenn versucht wird, einen Wert eines bestimmten Typs abzurufen, ohne sicherzustellen, dass die Union diesen Typ tatsächlich enthält.
Können wir eine typsichere Union in C# erreichen?
Ja, wir können typsichere diskriminierte Unions in C# implementieren, indem wir generische Einschränkungen und Mustervergleiche verwenden. Hier ist ein Beispiel:
public abstract class Union<A, B, C> { public abstract T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h); } public class Case1<A, B, C> : Union<A, B, C> { public readonly A Item; public Case1(A item) { Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => f(Item); } public class Case2<A, B, C> : Union<A, B, C> { public readonly B Item; public Case2(B item) { Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => g(Item); } public class Case3<A, B, C> : Union<A, B, C> { public readonly C Item; public Case3(C item) { Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) => h(Item); }
Verwendung:
Um diesen Union-Typ zu verwenden, erstellen Sie Instanzen bestimmter Fälle:
var union1 = new Case1<int, string, bool>(5); var union2 = new Case2<int, string, bool>('a'); var union3 = new Case3<int, string, bool>(true);
Mustervergleich:
Um den Wert aus der Vereinigung abzurufen, verwenden Sie Muster Matching:
var value1 = union1.Match(n => n, _ => null, _ => null); // Returns 5 (int) var value2 = union2.Match(_ => null, c => c.ToString(), _ => null); // Returns "a" (string) var value3 = union3.Match(_ => null, _ => null, b => b.ToString()); // Returns "True" (string)
Fazit:
Diese Lösung bietet typsichere diskriminierte Unions in C# durch Nutzung von Generika und Mustervergleich. Dadurch wird sichergestellt, dass der Code nicht versucht, auf falsche Werte zuzugreifen, was die Sicherheit und Korrektheit der Anwendung erhöht.
Das obige ist der detaillierte Inhalt vonWie können wir in C# typsichere diskriminierte Unions erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!