There are many solutions on the net for avoiding the null check. Here is mine: public interface Option<T> { } public struct Nothing<T> : Option<T> { } public struct Just<T> : Option<T> {     public readonly T Value;     public Just(T value) { Value = value; } } public static class OptionExtentions {     public static Option<T> ToOption<T>(this T value)     {         return (value == null)             ? new Nothing<T>() as Option<T>             : new Just<T>(value);     }     public static U Select<T, U>(this Option<T> option,       Func<T, U> func) where U : class     {         return option.Select(func, () => null);     }     public static U Select<T, U>(this Option<T> option,        Func<T, U> whereJust, Func<U> whereNothing)       where U : class     {         return option is Just<T>             ? whereJust(((Just<T>)option).Value)             : whereNothing();     } } And implementation return from h [...]