C# の判別共用体: 型安全性の強制
提供されたコード スニペットは、C# で判別共用体を作成する試みを示しています。このアプローチは、ある程度の型安全性を提供しますが、コンパイラによる強制的な型チェックが欠けています。 Is() および As() 関数。
型安全性の強化
この問題に対処するために、改善されたソリューションでは、より厳密な型安全な共用体構造が採用されています。この共用体は、C# のパターン マッチング メカニズムを利用して、不正なデータ型の使用時にコンパイル エラーをスローします。
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); } }
Usage
この強化された共用体を使用すると、パターン マッチングを通じて型の安全性が強制されます。 。たとえば、次のコードで間違ったデータ型を使用しようとすると、コンパイル エラーが発生します:
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' } }
パターン マッチングを使用した判別共用体を実装することで、より高度な型安全性が実現され、潜在的なランタイムが排除されます。不正なデータ型の処理に関連するエラー。
以上がパターン マッチングは C# の判別共用体における型の安全性をどのように強化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。