Operación extraña precedencia con ?? (operador de fusión nulo)

Recientemente tuve un error extraño en el que estaba concatenando una cadena con unint? y luego agregando otra cadena después de eso.

Mi código era básicamente el equivalente de esto:

int? x=10;
string s = "foo" + x ?? 0 + "bar";

Sorprendentemente, esto se ejecutará y compilará sin advertencias o errores de tipo incompatibles, como esto:

int? x=10;
string s = "foo" + x ?? "0" + "bar";

Y luego esto resulta en un error de incompatibilidad de tipo inesperado:

int? x=10;
string s = "foo" + x ?? 0 + 12;

Como será este ejemplo más simple:

int? x=10;
string s = "foo" + x ?? 0;

¿Alguien puede explicarme cómo funciona esto?