Нет, компилятор вообще не работает.
Компилятор не предназначен для того, чтобы указывать, что
if (nextDate != "TBC")
и
if (nextDate == "TBC")
являются взаимоисключающими.Он не пытается установить связь между этими двумя условиями.Так что он не может сказать, что вы определенно вызовете DateTime.TryParse(nextDate, out parsed)
, если вы доберетесь до return parsed;
.
По сути, компилятор следует относительно простым правилам для определения определенного назначения(и достижимость).Простые правила легко продумать, легко реализовать и легко кодировать.
К счастью, вы можете упростить свой код и , одновременно компилируя его:
public DateTime? Test(string nextDate)
{
if (nextDate == "TBC")
{
return null;
}
DateTime parsed;
if (!DateTime.TryParse(nextDate, out parsed))
{
throw new Exception();
}
return parsed;
}
Теперь мы имеем дело со «особым случаем» «TBD» в одном месте прямо в начале - и затем мы можем игнорировать этот особый случай для остальной части кода извоните TryParse
безоговорочно, оставляя parsed
однозначно назначенным.