Heim >Backend-Entwicklung >C++ >Wie erstelle ich typsichere diskriminierte Unions (Tagged Unions) in C#?

Wie erstelle ich typsichere diskriminierte Unions (Tagged Unions) in C#?

Susan Sarandon
Susan SarandonOriginal
2025-01-04 16:11:40649Durchsuche

How to Create Type-Safe Discriminated Unions (Tagged Unions) in C#?

Diskriminierende Union in C#

Frage:

So erstellen Sie eine diskriminierende Union in C# (auch getaggte Union genannt)? Diese Vereinigung ermöglicht die Verwendung verschiedener Typen zur Darstellung eines einzelnen Werts und bietet Typsicherheit zur Kompilierungszeit.

Antwort:

Mit generischen Typparametereinschränkungen können Sie typsichere, anspruchsvolle Unions erstellen. Der folgende Code zeigt, wie eine diskriminierende Union mit drei Fällen (int, char und string) erstellt wird:

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 : 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 : Union3<A, B, C>
    {
        public readonly B Item;
        public Case2(B item) { 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 : Union3<A, B, C>
    {
        public readonly C Item;
        public Case3(C item) { this.Item = item; }
        public override T Match<T>(Func<A, T> f, Func<B, T> g, Func<C, T> h)
        {
            return h(Item);
        }
    }
}

Um eine Instanz der diskriminierenden Union zu erstellen, verwenden Sie eine statische Factory-Methode, um den entsprechenden Fall anzugeben und Mehrwert bieten. Beispiel:

Union3<int, char, string> union1 = Union3<int, char, string>.Case1(5);
Union3<int, char, string> union2 = Union3<int, char, string>.Case2('x');
Union3<int, char, string> union3 = Union3<int, char, string>.Case3("Juliet");

Durch die Verwendung der Match-Methode können Sie auf Einzelfallbasis sicher auf den Wert der Union zugreifen. Beispiel:

string value1 = union1.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);
string value2 = union2.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);
string value3 = union3.Match(num => num.ToString(), character => new string(new char[] { character }), word => word);

Diese Methode verwendet eine Typprüfung zur Kompilierungszeit, um sicherzustellen, dass die richtige Funktion für den gegebenen Fall bereitgestellt wird. Der Compiler gibt einen Fehler aus, wenn Sie versuchen, auf einen Wert zuzugreifen, der nicht mit der Groß-/Kleinschreibung übereinstimmt.

Das obige ist der detaillierte Inhalt vonWie erstelle ich typsichere diskriminierte Unions (Tagged Unions) in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn