У меня есть метод Foo, который принимает строку. Он делает что-то, если строка имеет значение null, и что-то другое, если это не так (null является допустимым значением) Затем он возвращает ту же строку.
Вот Foo с обнуляемыми ссылочными типами отключено в C # 8.0:
string Foo(string s)
{
// Do something with s.
return s;
}
void Bar()
{
string s = "S";
string s2 = Foo(s);
string n = null;
string n2 = Foo(n);
}
После того, как я включу типы ссылок, которые можно обнулять, string n = null
выдает предупреждение. Это имеет смысл, так как string
больше не может быть nullable. Я конвертирую его тип в string?
:
void Bar()
{
string s = "S";
string s2 = Foo(s);
string? n = null; // X
string? n2 = Foo(n);
}
А теперь Foo(n)
предупреждает меня о новой неприязни Фу к обнуляемым строкам. Это также имеет смысл - Foo должен принимать пустую строку, поскольку он поддерживает как нулевые, так и ненулевые значения. Я изменяю его параметр и, следовательно, возвращаю типы на string?
:
string? Foo(string? s)
{
// Do something with s.
return s;
}
На этот раз string s2 = Foo(s)
, жалуется на то, что Фу вернул string?
, а я пытаюсь присвоить его string
.
Есть ли способ дать мне понять, что анализ потока понимает тот факт, что когда я предоставляю Foo string
(а не string?
), тогда его возвращаемое значение не может быть нулевым?