Sé que llego increíblemente tarde a esta pregunta, pero creo que la respuesta será relevante a medida que la última versión importante de C # se acerque al lanzamiento y luego al lanzamiento. En C # 8.0 ocurrirá un cambio importante, C # asumirá todos tipos no se consideran nulos.
Según Mads Torgersen:
El problema es que las referencias nulas son muy útiles. En C #, son el valor predeterminado de cada tipo de referencia. ¿Qué más sería el valor predeterminado? ¿Qué otro valor tendría una variable, hasta que pueda decidir qué más asignarle? ¿Con qué otro valor podríamos allanar una matriz de referencias recién asignada, hasta que llegues a completarla?
Además, a veces nulo es un valor sensible en sí mismo. A veces desea representar el hecho de que, digamos, un campo no tiene un valor. Que está bien pasar "nada" como parámetro. Sin embargo, el énfasis está en algunas veces. Y aquí radica otra parte del problema: los lenguajes como C # no le permiten expresar si un nulo aquí es una buena idea o no.
Entonces, la resolución esbozada por Mads es:
Creemos que es más común querer que una referencia no sea nula. Los tipos de referencia que aceptan valores NULL serían los más raros (aunque no tenemos buenos datos que nos indiquen cuánto), por lo que son los que deberían requerir una nueva anotación.
El lenguaje ya tiene una noción y una sintaxis para tipos de valores que aceptan valores NULL. La analogía entre los dos haría que la adición del lenguaje sea conceptualmente más fácil y lingüísticamente más simple.
Parece correcto que no deba agobiarse a sí mismo ni a su consumidor con valores nulos engorrosos a menos que haya decidido activamente que los quiere. Los nulos, no la ausencia de ellos, deberían ser lo que explícitamente debe aceptar.
Un ejemplo de la característica deseada:
public class Person
{
public string Name { get; set; } // Not Null
public string? Address { get; set; } // May be Null
}
La vista previa está disponible para Visual Studio 2017, 15.5.4+ vista previa.