2012-04-25 12 views
17

Na stronie MSDN:Dlaczego funkcja Convert.ToDouble (char) nie jest obsługiwana?

public static double ToDouble( char value )

Parametry

wartość
Typ: System.Char Znak Unicode do konwersji.

Return Value
Typ: System.Double Ta konwersja nie jest obsługiwany. Żadna wartość nie jest zwracana.

Jeśli nie jest obsługiwany, dlaczego jest zaimplementowany w pierwszej kolejności?

+3

Prawdopodobnie dlatego, że musiał być, dla niektórych interfejsów, IConvertible, może? Lub po prostu zachować standard.Nie pozwól mu tego przegapić i poszukaj - ale powiedz "tu jest, nie używaj tego" – SimpleVar

+8

@YoryeNathan 'Convert' jest klasą statyczną, nie implementuje żadnych interfejsów. 'Char' implementuje' IConvertible', a * jego * 'ToDouble' jest do tego wymagane, ale' Konwertuj' nie potrzebuje tego. Twoja alternatywa "zachować standard" może mieć rację. – hvd

+0

@hvd Masz rację. To było dla mnie głupie. – SimpleVar

Odpowiedz

5

To nie jedyny. Convert.ToBoolean (char), ToDateTime, ToDecimal i ToSingle również nie są obsługiwane, wszystkie rzucają InvalidCastException, jak to robi ToDouble.

To tylko projekt .NET, który próbuje zapobiec kłopotom. Konwersja znaku na typ integralny jest uzasadniona, można przejrzeć tabele odwzorowań Unicode i policzyć współrzędne kodowe. Ale co oznacza konwersja na Boolean? Co to jest kod Unicode True? ToDateTime nie wymaga żadnego wyjaśnienia. W jaki sposób postać może być wartością ułamkową? Nie ma pół ani czwartych współrzędnych kodowych.

Możesz może sprawiają, że działa, konwertuj na Int32 pierwszy, a następnie przekonwertować do Double. Ale na wszelkie sposoby, sprawdź swój kod i upewnij się, że jest to coś, co warto zrobić. Projektanci .NET uważali, że tak nie jest. Mają rację.

+1

To ma sens. Jednak "double doubleChar = (double)" a "; // OK' i 'var doubleValue = Convert.ToDouble (" a "); // InvalidCastException' jest nieco niespójny. – oleksii

+0

Hehe, projektanci po prostu nie mieli siły, by wykonać ten rzut. Reguły językowe trump projektowania ram. –

2

Każda litera ma odpowiednią liczbę całkowitą. Na przykład:

Convert.ToInt16('a') -> returns 97. 

Myślę, że głównym powodem, dlaczego Konwersja nie obsługuje przekonwertować z char inne typy jest, że drugi rodzaj znaku jest typem całkowitą.

Może bardziej wyraźnym przykładem jest następujący kod:

char a = 'a'; 
int aVal = (int)a; 

Które faktycznie Convert.ToInt32 ma (ale także podnosi wyjątek przepełnienia)

1
+1

To naprawdę nie odpowiada na pytanie, biorąc pod uwagę, że 'Konwertuj' ma wiele metod konwersji między typami, które mają niejawne konwersje między sobą. – Joey

+2

@Joey Właściwie to odpowiada na pytanie. Bez przeciążenia 'Convert.ToDouble (char)' aby rzucić wyjątek, zostanie wybrane inne przeciążenie, które nie wyrzuci wyjątku, a 'Convert.ToDouble (char)' nie będzie zachowywać się tak samo jak '((IConvertible) char) .ToDouble() '. – hvd

2

Jak na MSDN, funkcja ta jest zarezerwowany do przyszłego użytku w .Net 2.0 i jest utrzymywany do 4.5 za obsługę poprzedniej wersji frameworków .net.

Zostaną one wdrożone, jeśli przyszły system operacyjny będzie obsługiwał ten typ konwersji. Obecnie OS przechowuje char jako int, więc nie zapewnia sposobu na podwojenie liczby znaków z powodu dużej liczby wewnętrznych konwersji.

Ze względu na wewnętrzny format przechowywania, takie samo ograniczenie dotyczy Convert.ToDouble (DateTime).

Powiązane problemy