Efficient discriminated unions in C#7