Sei que estou incrivelmente atrasado para essa pergunta, mas sinto que a resposta se tornará relevante conforme a última grande iteração do C # se aproxima do lançamento e, em seguida, é lançada. No C # 8.0, uma grande mudança ocorrerá, o C # assumirá que todos os tipos são considerados não nulos.
De acordo com Mads Torgersen:
O problema é que as referências nulas são muito úteis. Em C #, eles são o valor padrão de cada tipo de referência. Qual seria o valor padrão? Que outro valor uma variável teria, até que você possa decidir o que mais atribuir a ela? Com qual outro valor poderíamos pavimentar uma nova matriz de referências alocada, até que você consiga preenchê-la?
Além disso, às vezes nulo é um valor lógico por si só. Às vezes, você deseja representar o fato de que, digamos, um campo não tem um valor. Não há problema em passar “nada” para um parâmetro. A ênfase está em algumas vezes, no entanto. E aqui está outra parte do problema: linguagens como C # não permitem que você expresse se um valor nulo aqui é uma boa ideia ou não.
Portanto, a resolução delineada por Mads é:
Acreditamos que é mais comum querer que uma referência não seja nula. Os tipos de referência anuláveis seriam os mais raros (embora não tenhamos bons dados para nos dizer por quanto), portanto, eles são os que devem exigir uma nova anotação.
A linguagem já tem uma noção de - e uma sintaxe para - tipos de valor anuláveis. A analogia entre os dois tornaria a adição da linguagem conceitualmente mais fácil e linguisticamente mais simples.
Parece certo que você não deve sobrecarregar a si mesmo ou ao consumidor com valores nulos pesados, a menos que tenha decidido ativamente que os deseja. Nulos, e não a ausência deles, deve ser algo que você explicitamente deve aceitar.
Um exemplo do recurso desejado:
public class Person
{
public string Name { get; set; } // Not Null
public string? Address { get; set; } // May be Null
}
A visualização está disponível para Visual Studio 2017, visualização 15.5.4+.