Краткое использование DBNull?(Троичный?) - PullRequest
9 голосов
/ 10 августа 2010

Кажется, что в тернарном операторе есть некоторая путаница типов.Я знаю, что это было рассмотрено в других потоках SO, но это всегда было с нулями.Кроме того, для моего случая я просто ищу лучший способ.

Я бы хотел использовать

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;

, но вместо этого я застрял с этим:

if (string.IsNullOrEmpty(dest.Id))
{
    proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
    proc.Parameters[PARAM_ID].Value = dest.Id;
} 

Тернарный оператор завершается неудачно, потому что невозможно преобразование между DBNull и строкой, и как бы глупо это не казалось, учитывая, что Value is object, компилятор возвращает его мне, и я вынужден позаботитьсяОтвет на обнуляемую версию этого вопроса - просто привести ноль к строке и покончить с этим;DBNull не может быть приведен к строке, так что не повезло.

Есть ли более краткий способ сделать это (кстати, без использования nullables?)

Спасибо!

Ответы [ 4 ]

20 голосов
/ 10 августа 2010

Вы можете изменить свое первое утверждение на:

proc.Parameters[PARAM_ID].Value = 
    string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
6 голосов
/ 10 августа 2010

Или вы можете добавить метод расширения, такой как:

public static class DBNullExtensions
{
    public static object AsDBNullIfEmpty(this string value)
    {
        if (String.IsNullOrEmpty(value))
        {
            return DBNull.Value;
        }
        return value;
    }
}

И тогда вы можете просто сказать

proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();

(адаптировано из Фил Хаак )

Читабельно и кратко, нет?

6 голосов
/ 10 августа 2010

Свойство Value имеет тип object, поэтому вы должны приводить к object, а не string:

proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
    ? (object)DBNull.Value
    : (object)dest.Id;
3 голосов
/ 23 октября 2014

Как насчет использования ?? нуль-коалесцирующий оператор Подробнее о ?? оператор

proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;
...