using System.Collections.Generic;
public static void Main()
var results = new IResult[]
new SuccessResult<int>( 1 ),
new FailureResult<int>( new[] { -1 } ),
foreach( var result in results )
SuccessResult<int> sri => $"Successful with data {sri.Data}",
SuccessResult sr => $"Successful with no data",
FailureResult<int> fri => $"Failed with errors",
FailureResult fr => $"Failed without errors",
_ => throw new NotImplementedException( result.GetType().FullName ),
Console.WriteLine( msg );
public record SuccessResult : IResult
public static readonly SuccessResult Instance = new();
public record SuccessResult<TData>( TData Data ) : SuccessResult;
public record FailureResult : IResult
public static readonly FailureResult Instance = new();
public record FailureResult<TError>( IEnumerable<TError> Errors ) : FailureResult;