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)
{
return option.Select(func, () => default(U));
}
public static U Select<T, U>(this Option<T> option,
Func<T, U> whereJust, Func<U> whereNothing)
{
return option is Just<T>
? whereJust(((Just<T>)option).Value)
: whereNothing();
}
}
And implementation:
return (from h in HttpContext.Current.ToOption()
select h.User);




