Diskriminierte Union in C#: Typsicherheit durchsetzen
Das bereitgestellte Code-Snippet zeigt einen Versuch, eine diskriminierte Union in C# zu erstellen, ähnlich der Union-Konzept in C. Während dieser Ansatz einen gewissen Anschein von Typsicherheit bietet, fehlt ihm die vom Compiler erzwungene Typprüfung in Is() und As()-Funktionen.
Verbesserungen für die Typsicherheit
Um dieses Problem zu beheben, verwendet eine verbesserte Lösung eine strengere typsichere Union-Struktur. Diese Union nutzt den Mustervergleichsmechanismus von C#, um Kompilierungsfehler bei falscher Datentypverwendung auszulösen:
public abstract class Union3<A, B, C> { public abstract T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h); private Union3() { } } public sealed class Case1<A, B, C> : Union3<A, B, C> { public readonly A Item; public Case1(A item) : base() { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return f(Item); } } public sealed class Case2<A, B, C> : Union3<A, B, C> { public readonly B Item; public Case2(B item) : base() { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return g(Item); } } public sealed class Case3<A, B, C> : Union3<A, B, C> { public readonly C Item; public Case3(C item) : base() { this.Item = item; } public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h) { return h(Item); } }
Verwendung
Mit dieser erweiterten Union wird die Typsicherheit durch Mustervergleich erzwungen . Beispielsweise führt der Versuch, im folgenden Code den falschen Datentyp zu verwenden, zu einem Kompilierungsfehler:
public void DoSomething() { if (ValueA.Match(a => true, b => false, c => false)) { var s = ValueA.Match(a => a.ToString(), b => null, c => null); // Safely use string type 's' } }
Durch die Implementierung einer diskriminierten Union mit Mustervergleich erreichen wir ein höheres Maß an Typsicherheit und eliminieren potenzielle Laufzeiten Fehler im Zusammenhang mit falscher Datentypverarbeitung.
Das obige ist der detaillierte Inhalt vonWie kann der Mustervergleich die Typsicherheit in C#-diskriminierten Unions verbessern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!