public sealed record Error(string Code, string Message = null);
public class Result<TValue, TError>
public readonly TValue Value;
public readonly TError Error;
private Result(TValue value)
private Result(TError error)
public static implicit operator Result<TValue, TError>(TValue value) => new Result<TValue, TError>(value);
public static implicit operator Result<TValue, TError>(TError error) => new Result<TValue, TError>(error);
public Result<TValue, TError> Match(Func<TValue, Result<TValue, TError>> success, Func<TError, Result<TValue, TError>> failure)
return _isSuccess ? success(Value!) : failure(Error!);
public static class DivedErrors
public static readonly Error DivisionByZero = new("Dived.DivisionByZero", "Division by zero is not allowed.");
public static readonly Error DivisionByOne = new("Dived.DivisionByOne", "Division by 1 always results in the dividend.");
public static Result<int, Error> Divide(int numerator, int denominator)
return DivedErrors.DivisionByZero;
return DivedErrors.DivisionByOne;
int result = numerator / denominator;
static void Main(string[] args)
Result<int, Error> divisionResult = Divide(4, 4);
Result<int, Error> rslt = divisionResult.Match(result => result, err => err);
Console.WriteLine(rslt.Error.Message);
Console.WriteLine(rslt.Value);