using System.Collections.Generic;
public record ExplainedValue<TResult>(TResult? Value, IList<string> Messages);
public class ExplainedValueBuilder<TResult> {
private IList<string> messages;
public ExplainedValueBuilder()
this.messages = new List<string>();
public ExplainedValueBuilder(ExplainedValueBuilder<TResult> from)
this.messages = new List<string>(from.messages);
public ExplainedValueBuilder<TResult> WithValue(TResult newValue)
return new ExplainedValueBuilder<TResult>( this )
public ExplainedValueBuilder<TResult> WithMessage(string message)
var newBuilder = new ExplainedValueBuilder<TResult>( this );
newBuilder.messages.Add(message);
public ExplainedValue<TResult> Build()
return new ExplainedValue<TResult>(this.value, this.messages);
public static void Main()
var explainedValue = new ExplainedValueBuilder<bool>()
.WithMessage("Message 1")
.WithMessage("Message 2")
foreach(var message in explainedValue.Messages)
Console.WriteLine($"Message = {message}");