2010-10-29 18 views
12

Czuje się dziwnie mi się odlew null typu więc chciałem, aby dokładnie sprawdzić, że jest to dobry sposób, żeby to zrobić:Czy można poprawnie rzutować wartość null na null przy użyciu potrójnego wyrażenia przypisującego typ null?

decimal? d = data.isSpecified ? data.Value : (decimal?)null; 

alt text

alt text

UWAGA: ja zaznaczam odpowiedź, która sugeruje metodę, którą ja osobiście najbardziej lubię:

decimal? d = data.isSpecified ? data.Value : default(decimal?) 
+1

Nie powinieneś potrzebować obsady. 'decimal?' zaakceptuje wartość zerową bezpośrednio. –

+0

dodano zrzut ekranu do wglądu. –

+6

@Robert Harvey, masz rację, że 'decimal?' Zaakceptuje wartość null, ale kompilator musi być w stanie określić typ zwrotny potrójnego wyrażenia, który może zrobić tylko wtedy, gdy null zostanie ustawiony na "decimal?". –

Odpowiedz

17

Tak, w porządku. Alternatywy:

condition ? (decimal?) value : null 

condition ? new decimal?(value) : null 

condition ? value : default(decimal?) 

condition ? value : new decimal?() 

Wybierz najlepiej pasujący tekst.

Nic nie można zrobić poza samym wyrażeniem, ponieważ jest to rodzaj wyrażenia, którego kompilator nie zna. Na przykład wstawienie całego wyrażenia w nawiasach i rzucenie go nie pomogłoby.

+0

Czy działa bez rzutowania, jeśli "wartość" była już "dziesiętna?"? –

+0

@Robert: Tak, w takim przypadku byłoby dobrze. Problem polega na tym, że typ wyrażenia warunkowego * albo * musi być typem LHS * lub * typem RHS ... a "null" nie ma typu. –

2

Ye s, jest idealnie w porządku.

1

Czy data.Value typu decimal? Jeśli tak, oto alternatywna notacja, bez obsady:

decimal? d = data.isSpecified ? new decimal?(data.Value) : null; 
Powiązane problemy