Nullable reference types (`string?`) no C# moderno
Pergunta
O que a feature 'nullable reference types' do C# 8+ faz, e por que é opt-in em vez de padrão?
Resposta esperada
Historicamente, qualquer tipo de referência em C# podia ser `null`, e `NullReferenceException` era o erro nº1. Nullable reference types traz o modelo do Kotlin/TS pro C#: com a feature ligada (`<Nullable>enable</Nullable>`), `string` significa 'não nulo' e `string?` significa 'pode ser nulo', e o compilador AVISA (warning, não erro) quando você desreferencia algo que pode ser null sem checar, ou atribui null a um não-nulável. É opt-in e por warning porque ligar num codebase grande gera centenas de avisos de uma vez — o modelo antigo assumia tudo nulável, então quase toda API precisa ser anotada. Times ligam por projeto/arquivo e vão anotando. É análise estática de fluxo (o compilador entende `if (x != null)`), não muda o runtime — no IL, `string` e `string?` são a mesma coisa.
Por que perguntam isso
Pergunta pleno de C#. Sinal de domínio: 'é análise de fluxo estática, não muda o runtime' e o paralelo com Kotlin/TS strictNullChecks.