What you are describing is something different called a disjoint union which will maintain the identities of the left and right values when there is overlap.
The C# unions appear to behave like unions, not disjoint unions.
The C# unions appear to behave like unions, not disjoint unions.
You are correct that this requires support for disjoint unions (aka tagged unions), which Haskell always had and C# will soon have.