首頁 > 後端開發 > C++ > 如何在 C# 中建立類型安全的可區分聯合(標記聯合)?

如何在 C# 中建立類型安全的可區分聯合(標記聯合)?

Susan Sarandon
發布: 2025-01-04 16:11:40
原創
633 人瀏覽過

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

C# 中的辨別聯合

問題:

問題:

如何創建如何創建聯合辨別(又稱tagged union)?此聯合允許使用不同的類型表示單一值,並提供編譯時類型安全性。

答案:
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);
        }
    }
}
登入後複製

使用泛型型別參數約束,可以創造型別安全的辨別聯合。以下程式碼示範如何建立一個具有三個案例(int、char 和string)的辨別聯合:
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");
登入後複製

要建立辨別聯合的實例,請使用靜態工廠方法來指定對應的案例並提供值。例如:
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);
登入後複製

透過使用 Match 方法,可以根據特定案例安全地存取聯合的值。例如:此方法使用編譯時類型檢查來確保為給定的案例提供了正確的函數。如果嘗試存取與案例不匹配的值,編譯器將拋出錯誤。

以上是如何在 C# 中建立類型安全的可區分聯合(標記聯合)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板