Возвращаемые типы строк с возможностью NULL

Итак, у меня есть что-то вроде этого

public string? SessionValue(string key)
{
    if (HttpContext.Current.Session[key].ToString() == null || HttpContext.Current.Session[key].ToString() == "")
        return null;

    return HttpContext.Current.Session[key].ToString();
}

который не компилируется.

Как вернуть нулевой тип строки?

Ответ 1

Строка уже имеет тип с нулевым значением. Nullable может использоваться только в ValueTypes. Строка является ссылочным типом.

Просто избавься от "?" и вам должно быть хорошо идти!

Ответ 2

Как и все остальные, string не нуждается в ? (который является ярлыком для Nullable<string>), потому что все ссылочные типы (class es) уже имеют значение NULL. Он применяется только к типу значения (struct s).

Кроме того, вы не должны вызывать ToString() по значению сеанса перед проверкой, есть ли он null (или вы можете получить NullReferenceException). Кроме того, вам не нужно проверять результат ToString() для null, потому что он никогда не должен возвращать null (если это правильно реализовано). И вы уверены, что хотите вернуть null, если значение сеанса является пустым string ("")?

Это эквивалентно тому, что вы хотели написать:

public string SessionValue(string key)
{
    if (HttpContext.Current.Session[key] == null)
        return null;

    string result = HttpContext.Current.Session[key].ToString();
    return (result == "") ? null : result;
}

Хотя я бы написал его вот так (возвращаем пустой string, если это то, что содержит значение сеанса):

public string SessionValue(string key)
{
    object value = HttpContext.Current.Session[key];
    return (value == null) ? null : value.ToString();
}

Ответ 3

Вы можете назначить нуль для строки с ее ссылочным типом, вам не нужно делать ее допустимой.

Ответ 4

Строка уже имеет тип с нулевым значением. Вам не нужно "?".

Ошибка 18 Тип "строка" должен быть тип с нулевым значением для того, чтобы используйте его как параметр 'T' в общем тип или метод 'System.Nullable'

Ответ 5

string уже сам по себе недействителен.