Я не понимаю, почему это не сработает
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: null;
Я не понимаю, почему это не сработает
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: null;
Потому что null имеет тип object (фактически нетипированный), и вам нужно назначить его типизированному объекту.
Это должно работать:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: (decimal?)null;
или это немного лучше:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: default(decimal?);
Вот ссылка MSDN для default.
Не используйте decimal.Parse.
Convert.ToDecimal вернет 0, если ему задана пустая строка. decimal.Parse будет генерировать ArgumentNullException, если строка, которую вы хотите проанализировать, имеет значение null.
Попробуйте следующее:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ?
decimal.Parse(txtLineCompRetAmt.Text.Replace(",", "")) :
(decimal?) null;
Проблема заключается в том, что компилятор не знает, какой тип null имеет. Поэтому вы можете просто направить его на decimal?
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text) ?
decimal.Parse(txtLineCompRetAmt.Text.Replace(",","")) :
(decimal?)null;
Поскольку компилятор не может вывести лучший тип из операндов условного оператора.
Когда вы пишете condition ? a : b, должно быть неявное преобразование из типа a в тип b или из типа b в тип a. Затем компилятор выводит тип всего выражения в качестве целевого типа этого преобразования. Тот факт, что вы назначаете его переменной типа decimal?, никогда не рассматривается компилятором. В вашем случае типы a и b являются decimal и неизвестным типом ссылки или типа NULL. Компилятор не может догадаться, что вы имеете в виду, поэтому вам нужно помочь:
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: default(decimal?);
Вам нужно передать первую часть в decimal?
decimal? compRetAmount = !string.IsNullOrEmpty(txtLineCompRetAmt.Text)
? (decimal?)decimal.Parse(txtLineCompRetAmt.Text.Replace(",",""))
: null;