It's really annoying that in C#, the semantics of T? change depending on whether T is a value type or a reference type.T? where T : struct → Nullable<T>T? where T : notnull → [AllowNull] T