Альтернатива IsNullOrEmpty для обнуляемых типов? - PullRequest
0 голосов
/ 16 мая 2019

Есть ли способ использовать IsNullOrEmpty с обнуляемыми типами?Приведенный выше код генерирует ошибку сборки при использовании IsNullOrEmpty с string? RunDate

    public int MyMethod(string? RunDate = null)
    {

        string sql = string.Empty;
        int rowsChanged = -1;
        if (String.IsNullOrEmpty(RunDate))
        {
            //do stuff
        }
     }

Ответы [ 4 ]

2 голосов
/ 16 мая 2019

Похоже, вы намереваетесь использовать ? как в TypeScript, где оно подразумевает необязательное значение;но это не так в C #.В C # синтаксис T? является сокращением для Nullable<T>.Структура Nullable<T> имеет ограничение на T, такое T также должно быть структурой.System.String, это class, а не struct, поэтому его нельзя использовать с Nullable<T>.

Цель Nullable<T> состоит в том, чтобы содержать либо значение типа T ИЛИ null, поскольку значения на основе struct не могут быть пустыми ссылками сами по себе.Все значения на основе class могут уже содержать нулевые ссылки, поэтому использовать их с Nullable<T> не имеет смысла.

Попробуйте переписать код следующим образом:

public int MyMethod(string RunDate = null)
    {

        string sql = string.Empty;
        int rowsChanged = -1;
        if (String.IsNullOrEmpty(RunDate))
        {
            //do stuff
        }
     }
1 голос
/ 16 мая 2019

Это должна быть string? RunDate = null эта строка.Вам не нужно объявлять строку как обнуляемый тип string?, поскольку string сам по себе является ссылочным типом и, таким образом, по умолчанию null.Это может быть просто

public int MyMethod(string RunDate = null)
{
   // rest of code
}
0 голосов
/ 16 мая 2019

Быстрый ответ, нет.

Более длинный ответ, пока нет.

Прямо сейчас, до выпуска C # 8 (ну, если вы не используете предварительный просмотр C # 8, т. Е.), Символ ?, когда он используется для указания обнуляемых ссылочных типов, является синтаксической ошибкой. Давайте пока проигнорируем C # 8.

type? переводится в Nullable<type>, а структура Nullable<T> объявляется так:

public struct Nullable<T> where T : struct

Другими словами, T не может быть string, так что это, string?, недопустимо. Это то, что дает вам синтаксическую ошибку.

Пока не будет выпущен C # 8 или вы не начнете использовать предварительный просмотр C # 8, вы ничего не сможете сделать, кроме удаления знака вопроса.


Что происходит при выходе C # 8?

Ну, type? для ссылочных типов не будет переводиться в Nullable<T>, а вместо этого в T со знанием об обнуляемости. Для полей, свойств, параметров, возвращаемых типов, в основном всего, что не является локальной переменной, это преобразуется в объявление с атрибутом, устанавливающим обнуляемость. Для локальных переменных компилятор будет отслеживать обнуляемость.

Таким образом, в этом случае string.IsNullOrEmpty будет фактически работать, потому что параметр по-прежнему будет в основном строкой, это будет просто строка со знанием обнуления, прикрепленной к нему.

0 голосов
/ 16 мая 2019

Оператор ? используется для объявления необнуляемых типов как обнуляемых, и компилятор компилирует их в тип Nullable<T>.

System.String является ссылочным типом, поэтому может иметь значение null.

Удалите оператор ?, и все должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...