首页 > 后端开发 > C++ > 如何在 C# 中创建类型安全的可区分联合(标记联合)?

如何在 C# 中创建类型安全的可区分联合(标记联合)?

Susan Sarandon
发布: 2025-01-04 16:11:40
原创
671 人浏览过

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

C# 中的辨别联合

问题:

如何创建 C# 中的辨别联合(又称为 tagged union)?该联合允许使用不同的类型表示单一值,并提供编译时类型安全。

答案:

使用泛型类型参数约束,可以创建类型安全的辨别联合。以下代码演示了如何创建一个具有三个案例(int、char 和 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);
        }
    }
}
登录后复制

要创建辨别联合的实例,请使用静态工厂方法来指定相应的案例并提供值。比如:

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");
登录后复制

通过使用 Match 方法,可以根据特定案例安全地访问联合的值。比如:

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);
登录后复制

此方法使用编译时类型检查来确保为给定的案例提供了正确的函数。如果尝试访问与案例不匹配的值,编译器将抛出错误。

以上是如何在 C# 中创建类型安全的可区分联合(标记联合)?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板