namespace ConsoleApplication1
public struct Optional<T>
public Optional(T value){
public bool HasBeenSet {get {return hasBeenSet;}}
public override bool Equals(object obj)
public override int GetHashCode()
return val.GetHashCode();
static public implicit operator T(Optional<T> optional){
static public implicit operator Optional<T>(T optional){
return new Optional<T>(optional);
public Optional<string> name1;
public Optional<string> name2;
public Optional<POCO> moo;
public Optional<int> number;
public Optional<int?> numberMoo;
public static void Main(string[] args)
Console.WriteLine(poco.name1.HasBeenSet);
Console.WriteLine(poco.name1);
Console.WriteLine(poco.name2.HasBeenSet);
Console.WriteLine(poco.name2);
Console.WriteLine(poco.moo.HasBeenSet);
Console.WriteLine(poco.moo.HasBeenSet);
Console.WriteLine(poco.number.HasBeenSet);
Console.WriteLine(poco.numberMoo.HasBeenSet);