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 [...]