Maison > développement back-end > C++ > Comment créer des unions discriminées de type sécurisé (unions étiquetées) en C# ?

Comment créer des unions discriminées de type sécurisé (unions étiquetées) en C# ?

Susan Sarandon
Libérer: 2025-01-04 16:11:40
original
633 Les gens l'ont consulté

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

Union discriminante en C#

Question :

Comment créer une union discriminante en C# (également appelé union étiquetée) ? Cette union permet d'utiliser différents types pour représenter une valeur unique et assure la sécurité des types au moment de la compilation.

Réponse :

En utilisant des contraintes de paramètres de type génériques, vous pouvez créer des unions discernantes de type sécurisé. Le code suivant montre comment créer une union discriminante avec trois cas (int, char et string) :

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);
        }
    }
}
Copier après la connexion

Pour créer une instance de l'union discriminante, utilisez une méthode de fabrique statique pour spécifier le cas correspondant et apporter de la valeur. Par exemple :

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");
Copier après la connexion

En utilisant la méthode Match, vous pouvez accéder en toute sécurité à la valeur de l'union dans un cas précis. Par exemple :

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);
Copier après la connexion

Cette méthode utilise la vérification de type au moment de la compilation pour garantir que la fonction correcte est fournie pour le cas donné. Le compilateur générera une erreur si vous essayez d'accéder à une valeur qui ne correspond pas à la casse.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal