Обнуляемые ссылочные типы - обнуляемость возвращаемого типа по принятому параметру - PullRequest
0 голосов
/ 08 января 2019

У меня есть метод 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?), тогда его возвращаемое значение не может быть нулевым?

1 Ответ

0 голосов
/ 08 января 2019

Да, просто есть два метода. Один, который принимает string? и возвращает string?, а другой, который принимает string и возвращает string. Возможно, вы захотите реализовать первое в терминах последнего (проверьте на ноль, если не ноль, вызовите другой метод, в противном случае обработайте нулевой случай).

Наличие двух методов - это то, как вы гарантируете, что возвращаемый тип отличается в зависимости от типа (ов) ввода.

...