2014-01-25 11 views
2

Ну это один метод для обработки DBNull.value, Но я хочу синтаксис с помощью оператора нуль-коалесцирующий для обработки DBNull.valueКак использовать оператор collasce null с DbNull.Value?

Это будет работать

decimal UnitPrice = row["UnitPrice"] == DBNull.Value ? 0.00m : (decimal)row["UnitPrice"]; 

Ну я попробовал это, ни один из них работает ,

decimal UnitPrice = (decimal)row["UnitPrice"] ?? 0.00m 
UnitPrice = Convert.ToDecimal(row["UnitPrice"]) ?? 0.00m 
UnitPrice = Decimal.Parse(row["UnitPrice"].ToString()) ?? 0.00m 

Я получаю эту

Operator '??' cannot be applied to operands of type 'decimal' and 'decimal' 

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

ответ

0

decimal является типом значения и не может быть null. Вы можете использовать ?? оператор только reference types. Вы можете продолжать использовать первый способ, или вы можете сделать что-то вроде:

decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal) 
2

Проблема заключается в том, что DBNull.Value не является нулевым. Кажется, что вы хотите заменить DBNull.Value на 0.0m, но лучшим решением будет использование типов с нулевым значением. То есть, используйте decimal?, а не decimal. Затем вы можете использовать as оператор:

decimal? unitPrice = row["UnitPrice"] as decimal?; 

Если вы не можете сделать это, вы можете сделать это вместо того, чтобы:

decimal unitPrice = (row["UnitPrice"] as decimal?) ?? 0.0m 

или

decimal unitPrice = (row["UnitPrice"] as decimal?).GetValueOrDefault(); 

функция помощник сделает его немного меньше подробностей, если вы делаете это много:

T FromObject<T>(object o) where T : struct { return (o as T?).GetValueOrDefault(); } 

затем

decimal unitPrice = FromObject<decimal>(row["UnitPrice"]); 

Если вам необходимо ненулевое значение по умолчанию:

T FromObject<T>(object o, T defaultValue) where T : struct 
{ 
    return (o as T?).GetValueOrDefault(defaultValue); 
} 

затем

decimal unitPrice = FromObject<decimal>(row["UnitPrice"], Decimal.MinValue); 

Недостатком этого подхода является то, что если изменить базовый тип из столбец базы данных, вы начнете получать ложные нули назад вместо исключений. Это потому, что если объект, например, 1.2f, то o as decimal? вернет null, который затем будет заменен на 0.0m. Однако выражение o == DBNull.Value ? 0.0m : (decimal)o будет эквивалентно (decimal)(object)1.2f, что не получится с InvalidCastException, которое лучше, чем предоставление всех ваших продуктов бесплатно.