The issue is "what is the type of an inline record"? Internally each inline record in a constructor declaration has its own type, so in particular two different records have distinct types. One way to think of it is that
type t = A of {i:int} | B of {i:int};;
is morally equivalent to
type t_internal_A = {i : int};;
type t_internal_B = {i : int};;
type t = A of t_internal_A | B of t_internal_B;;
And then (function (A e | B e) -> e.i) does not type-check either -- with the same error message. This comes from the fact that, in OCaml (unlike in SML), records are nominal, have an identity: declaring another record type with the same fields creates a new, incompatible type.
So the answer is: this is a natural, expected consequence of how inline records and how records work in OCaml.