Насколько я понимаю C#, ситуация прямо противоположна тому, что вы описываете. Если какая-либо переменная не инициализирована, но используется, компилятор C# обязательно выдаст ошибку компиляции. А вот обратные ситуации возможны: компилятор не всегда может понять, что переменная гарантировано будет инициализирована, и может выдать ложную ошибку, заставляя вас проводить ненужную инициализацию.
Пример:
int n;
if (k * 0 == 0)
n = 0;
Console.WriteLine(n);
В других языках это не так. Например, C++ считает инициализацию переменных ответственностью программиста, использование неинициализированных переменных не контролирует, и считает неопределённым поведением (UB). При этом, в качестве прикола, если он таки может доказать, что переменная неинициализирована, он может вовсе уничтожить соптимизировать код в ничто.
Пример:
int definietly_UB()
{
int n;
return n;
}
Тут компилятор не предупреждает об использовании неинициализированной переменной, а просто молча производит бессмысленный компилят.
Особенно интересен второй пример:
int conditional_UB(int k)
{
int n;
if (k == 10)
n = 7;
return n;
}
Тут компилятор пользуется привилегией считать, что неинциализированных переменных не бывает, и без тени сомнения выдаёт компилят:
mov eax, 7
ret
Таким образом, разные языки подходят к неинициализированным переменным по-разному.