2015-07-09 4 views
0

Я получил этот код, предназначенный для преобразования нулевых десятичных Vals в «нулевой» величины:Как я могу проверить десятичное значение для null?

decimal paymentTot = TryConvertToDecimal(boxPaymentAmount.Text); 
if ((null == paymentTot) || (paymentTot < 0)) 
{ 
    paymentTot = 0M; // or simply 0? 
} 

private decimal TryConvertToDecimal(String incoming) 
{ 
    decimal result = 0.0M; 
    try 
    { 
     result = Convert.ToDecimal(incoming); 
    } 
    catch 
    { 
     ; // nada 
    } 
    return result; 
} 

Он компилирует, но я получаю это предупреждение: «Результат выражения всегда„ложь“так как значение типа «десятичный» никогда не равно «null» типа «десятичный?»

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

+2

'decimal' является типом значения и никогда не может быть' null'. Вы хотите, чтобы результат «TryConvertToDecimal' был« null », если синтаксический анализ не прошел? –

+0

Нет, я хочу, чтобы он возвращал 0. –

ответ

4

decimal - тип значения, и он не может быть пустым.

Если вы хотите иметь обнуляемый десятичную затем использовать Nullable<decimal> или decimal?, который является оболочкой на decimal типа, (это еще типа значения, хотя).

См: Nullable<T> Structure

Вы также можете иметь свой метод для анализа, как:

private Nullable<decimal> TryConvertToDecimal(String incoming) 
{ 
    Nullable<decimal> returnValue = null; 
    decimal result; 
    if (decimal.TryParse(incoming, out result)) 
    { 
     returnValue = result; 
    } 
    return returnValue; 
} 

Также лучше использовать decimal.TryParse, если вы собираетесь игнорировать исключение в разборе.

+0

Обратите внимание, что 'decimal?' Также является типом значения. Важно то, что 'decimal' - тип значения, не допускающего значения NULL. –

2

Возможно, вы захотите вернуть Nullable<decimal> (стенограмма decimal?) от TryConvertToDecimal, потому что десятичный тип является типом с нулевым значением.

private decimal? TryConvertToDecimal(String incoming) 
{ 
    try 
    { 
     return Convert.ToDecimal(incoming); 
    } 
    catch 
    { 
     return null; 
    } 
} 

var paymentTot = TryConvertToDecimal(boxPaymentAmount.Text); 
if (!paymentTot.HasValue || paymentTot.Value < 0) 
{ 
    paymentTot = 0; 
} 

Однако обратите внимание, что в соответствии с соглашением TryXXX функции возвращает bool и использовать out аргумент для возврата разобранного значения в случае успеха. Один из них встроен в рамки является decimal.TryParse, которые вы можете использовать вместо:

decimal paymentTot; 
if(!decimal.TryParse(boxPaymentAmount.Text, out paymentTot) || paymentTot < 0) 
    paymentTot = 0; 

по умолчанию будет 0, если синтаксический анализ терпит неудачу или если проанализированное значение < 0, как указано в вашем вопросе. Я бы предположил, что это, скорее всего, решение, которое вы ищете.

1

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

decimal paymentTot; 
if(!decimal.TryParse(boxPaymentAmount.Text, out paymentTot)) 
    paymentTot = 0; 
Смежные вопросы