Here's a F# inspired Result type implemented in C#:
public class Error
{
public Error(string error) => Value = error;
public string Value { get; }
}
public class Result<T>
{
readonly string _error;
public Result(Error error) => _error = error.Value;
public Result(T value) => Value = value;
public bool IsSuccessful { get => _error == null; }
public T Value { get; }
}