While Refactoring the LazyLoader, we produced the code below.  It’s useful any time you want to add a sentinel value to a type.

 

interface IOptional<T>

{

    T Value { get;}

}

 

class None<T> : IOptional<T>

{

    public T Value

    {

        get { throw new System.NotImplementedException(); }

    }

}

 

class Some<T> : IOptional<T>

{

    readonly T value;

    public Some(T value)

    {

        this.value = value;

    }

 

    public T Value

    {

        get { return this.value; }

    }

}