2013-05-02 13 views
12

Zastanawiam się, jaki byłby najlepszy sposób (w sensie bezpieczniejszego i zwięzłego) przekształcenia jednego typu nulla w inny "kompatybilny" typu zerowalnego.Konwersja dziesiętna? podwoić?

W szczególności, konwersja z dziesiętnych? podwoić? można to zrobić, używając:

public double? ConvertToNullableDouble(decimal? source) 
{ 
    return source.HasValue ? Convert.ToDouble(source) : (double?) null; 
} 

Czy istnieje lepszy sposób na zrobienie tego? Może wykorzystując standardową konwersję?

+0

Twoja droga to dobra droga. – SimpleVar

+1

Robisz to dobrze! Sprawdź również ten odnośnik: http://stackoverflow.com/questions/5487685/conversion-between-nullable-types – MUG4N

Odpowiedz

22

Wbudowane odlewy do wygrania! Tylko przetestowane w VS2012 i VS2010:

decimal? numberDecimal = new Decimal(5); 
decimal? nullDecimal = null; 
double? numberDouble = (double?)numberDecimal; // = 5.0 
double? nullDouble = (double?)nullDecimal;  // = null 

tylko za pomocą wyraźnego obsady rzuci null null i wewnętrzną wartość dziesiętną podwojenia. Powodzenie!

+0

Testowany i działa jak urok. Dzięki, tego właśnie szukałem, ale nie myślałem o wbudowanym obsadzie. –

+0

To dziwne, skoro w pytaniach takich jak ten związany z MUG4N wydaje się, że wielu ludzi ma teorie, ale nikt właściwie nie * próbował *. :) –

+2

W rzeczywistości * wszystkie * konwersje, które obejmują źródło i cel typu wartości niedozwolalnej, mogą być "podnoszone do wartości zerowej". –

1

W ogóle, jeśli chcesz o, konwertować z dowolnego typu danych do drugiego, o ile są one zgodne, użyj tego:

Convert.ChangeType(your variable, typeof(datatype you want convert to)); 

na przykład:

string str= "123"; 
    int value1 = (int)Convert.ChangeType(str, typeof(int)); 
    float? value2 = (float?)Convert.ChangeType(str, typeof(float)); 
    ................................... 

Trochę dalej , jeśli chcesz, aby było bezpieczniej, możesz dodać próbkę:

string str= "123"; 
try 
{ 
    int value1 = (int)Convert.ChangeType(str, typeof(int)); 
    int? value2 = (int?)Convert.ChangeType(str, typeof(int)); 
    float value3 = (float)Convert.ChangeType(str, typeof(float)); 
    float? value4 = (float?)Convert.ChangeType(str, typeof(float)); 
} 
catch(Exception ex) 
{ 
    // do nothing, or assign a default value 
} 

testowany pod VS 20 10

+0

Tak, jest to bardziej ogólny sposób konwersji między typami, a nie tak zwięzły jak zaakceptowana odpowiedź. @Giswin Czy działa również na nullable? Wyobrażam sobie, że tak, ale nie znalazłem konkretnego komentarza na ten temat w [dokumentacji] (http://msdn.microsoft.com/en-us/library/dtb69x08.aspx). –

+0

możesz użyć tego: dziesiętny? v1 = 222; podwójne? V2 = (double?) Convert.ChangeType (v1, typeof (double)); , ale jeśli v1 ma wartość null, Convert.ChangeType rzuci wyjątek. a następnie spróbować złapać dawkę lewej pracy. – Gisway