¿Por qué agregarle null a una cadena es legal?

El artículo de MSDN sobre Conceptos básicos de cadenas muestra esto:

string str = "hello"; string nullStr = null; string emptyStr = ""; string tempStr = str + nullStr; // tempStr = "hello" bool b = (emptyStr == nullStr);// b = false; string newStr = emptyStr + nullStr; // creates a new empty string int len = nullStr.Length; // throws NullReferenceException 

¿Por qué no concatenando con null lanza una excepción de referencia nula? ¿Es para hacer la vida de un progtwigdor más fácil, de modo que no tengan que verificar el valor nulo antes de la concatenación?

Desde MSDN :

En las operaciones de concatenación de cadenas, el comstackdor de C # trata una cadena nula igual que una cadena vacía, pero no convierte el valor de la cadena nula original.

Más información sobre el + operador binario :

El operador binario + realiza la concatenación de cadenas cuando uno o ambos operandos son de tipo cadena.

Si un operando de concatenación de cadenas es nulo, se sustituye una cadena vacía. De lo contrario, cualquier argumento que no sea cadena se convierte a su representación de cadena invocando el método virtual ToString heredado de tipo objeto.

Si ToString devuelve null, se sustituye una cadena vacía.

Estoy de acuerdo en que las cadenas conceptuales son solo valores. Sin embargo, considere el siguiente código:

 int? i = null; i += 1; // The result of this is that i == null 

Si los otros operadores de tipo de valor usaban default () la forma en que los operadores de cadena están convirtiendo null en “”, su explicación tendría sentido.

Es más simple decir que los operadores de cuerda son un atajo (caso especial) por conveniencia.

Conceptualmente, las cadenas normalmente se consideran valores en oposición a las referencias a objetos que tienen identidad. Una de las razones principales por las que no son struct con semántica de valores se debe a la sobrecarga que conlleva copiar con asignación. Si las cadenas fueran valores, no podrían ser anulables, por lo que un null solo es tratado por el operador “+” como si fuera una cadena vacía (es decir, como si por default(string) == "" simplemente como por default(int) == 0 ).

Creo que los diseñadores del lenguaje (o biblioteca estándar) decidieron que este sería un caso bastante común que les haría un favor a los progtwigdores.

(¡Aseado! ¡Siempre asumí que concalling con null lo haría a través de una excepción!)

La razón por la que no lanza una excepción de referencia nula es porque en realidad no está intentando acceder a ninguna propiedad o método en el objeto nulo. Como cita CMS, al concatenar cadena, los nulos se reemplazan por cadenas vacías.