Kaip naudoti „collasce null“ operatorių su „DbNull.Value“?

Na, tai yra vienas iš DBNull.value apdorojimo DBNull.value , bet noriu, kad sintaksė, naudojant operatorių nulinės DBNull.value tvarkytų DBNull.value

Jis veiks

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

Na, aš bandžiau, nė vienas iš jų neveikia,

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

Aš jį gaunu

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

Aš galiu paklausti neteisingo klausimo arba klausimas gali būti negaliojantis, žinant, net jei taip yra, prašome leisti, kad jis būtų šviesus :)

3
25 янв. nustatė user3234515 25 sausis 2014-01-25 10:31 '14, 10:31 2014-01-25 10:31
@ 2 atsakymai

Problema ta, kad DBNull.Value nėra nulinis. Atrodo, kad norite pakeisti DBNull.Value su 0,0m, bet geriausias sprendimas būtų naudoti nulinės vertės tipus. Tai reiškia, kad naudokite decimal? ne decimal . Tada galite naudoti as operatorių:

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

Jei negalite to padaryti, galite tai padaryti:

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

arba

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

Pagalbos funkcija leis šiek tiek mažiau verbuoti, jei tai padarysite daug:

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

tada

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

Jei jums reikia nulinės numatytosios vertės:

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

tada

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

Šio požiūrio trūkumas yra tas, kad jei pakeisite bazės stulpelio tipą, pradėsite gauti klaidingus nulius, o ne išimtis. Taip yra todėl, jei objektas, pvz., 1.2f , o o as decimal? grąžins nulį, kuris bus pakeistas 0,0 m. Išraiška o == DBNull.Value? 0.0m: (decimal)o o == DBNull.Value? 0.0m: (decimal)o o == DBNull.Value? 0.0m: (decimal)o o == DBNull.Value? 0.0m: (decimal)o , tačiau, bus lygiavertė (decimal)(object)1.2f , kuri neįmanoma naudojant „InvalidCastException“, kuri yra geresnė už visus savo produktus nemokamai.

2
25 янв. atsakymas duotas phoog sausio 25 d 2014-01-25 10:55 '14 at 10:55 2014-01-25 10:55

decimal yra vertės tipas ir negali būti null . Ar galite naudoti ?? operatorius, turintis tik reference types. Galite toliau naudoti pirmąjį metodą, arba galite padaryti kažką panašaus:

 decimal UnitPrice = (object)row["UnitPrice"] ?? default(decimal) 
0
25 янв. atsakymą pateikė Selman Genç sausio 25 d 2014-01-25 10:45 '14, 10:45 2014-01-25 10:45