Кажется, что существует некоторый беспорядок типа в тернарном операторе. Я знаю, что это было обращено в другом ТАК потоки, но это всегда было с nullables. Кроме того, для моего случая я действительно просто ищу лучший путь.
Я хотел бы смочь использовать
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 и строкой, и столь же глупо, как это кажется, что Значение рассмотрения является объектом, компилятор отвечает ему ударом на удар мне, и я вынужден заботиться. Ответ на nullable версию этого вопроса должен просто бросить пустой указатель, чтобы представить в виде строки и быть сделанным с ним; DBNull не может быть брошен для строкового представления, тем не менее, так никакая удача там.
Есть ли более краткий способ сделать это (не используя nullables, между прочим?)
Спасибо!
Вы можете изменить свой первый оператор на:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
Или вы можете добавить метод расширения, такой как:
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();
(Адаптировано из Phil Haack)
Читабельно и лаконично, нет?
Свойство Value
имеет тип объект
, поэтому вам следует привести его к объекту
, а не к строке
]:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;