¿Por qué este código no es válido en C #?

El siguiente código no se compilará:

string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;

Yo obtengo:Error 1 El tipo de expresión condicional no se puede determinar porque no hay una conversión implícita entre 'System.DBNull' y 'cadena'

Para arreglar esto, debo hacer algo como esto:

string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;

Este elenco parece inútil ya que esto es ciertamente legal:

string foo = "bar";
Object o = foo == null ? "gork" : foo;

Me parece que cuando las ramas ternarias son de diferentes tipos, el compilador no realizará un autobox de los valores al tipo de objeto ... pero cuando son del mismo tipo, entonces el autoboxing es automático.

En mi opinión, la primera declaración debería ser legal ...

¿Puede alguien describir por qué el compilador no permite esto y por qué los diseñadores de C # eligieron hacer esto? Creo que esto es legal en Java ... Aunque no lo he verificado.

Gracias.

EDITAR: Estoy pidiendo una comprensión de por qué Java y C # manejan esto de manera diferente, qué sucede debajo de las escenas en C # que hacen que esto no sea válido. Sé cómo usar ternario y no estoy buscando una "mejor manera" para codificar los ejemplos. Entiendo las reglas ternarias en C #, pero quiero saber POR QUÉ ...

EDITAR (Jon Skeet): Se eliminó la etiqueta "autoboxing" ya que no hay boxeo involucrado en esta pregunta.

Respuestas a la pregunta(3)

Su respuesta a la pregunta