2012-04-25 20 views
17

Desde la página de MSDN:¿Por qué no se admite Convert.ToDouble (char)?

public static double ToDouble( char value )

Parámetros

valor
Tipo: System.Char El carácter Unicode para convertir.

Valor devuelto
Tipo: System.Double Esta conversión no es compatible. No se devuelve ningún valor

Si no es compatible, ¿por qué se implementa en primer lugar?

+3

Probablemente porque tenía que ser, para alguna interfaz, IConvertible, tal vez? O solo para mantener un estándar.No lo dejes perder y buscar, pero dile "aquí está, no lo uses" – SimpleVar

+8

@YoryeNathan 'Convert' es una clase estática, no implementa ninguna interfaz. 'Char' implementa' IConvertible', y * its * 'ToDouble' es necesario para eso, pero' Convert' no lo necesita. Su alternativa, "mantener un estándar", puede ser correcta. – hvd

+0

@hvd Tienes razón. Eso fue tonto de mi parte – SimpleVar

Respuesta

5

No es el único. Convert.ToBoolean (char), ToDateTime, ToDecimal y ToSingle tampoco son compatibles, todos arrojan InvalidCastException como lo hace ToDouble.

Este es solo el diseño .NET que intenta mantenerte fuera de problemas. La conversión de un char a un tipo integral es razonable, puede mirar las tablas de asignación de Unicode y contar los puntos de código. Pero, ¿qué significaría una conversión a Boolean? ¿Qué punto de código Unicode es Verdadero? ToDateTime no requiere explicación. ¿Cómo podría un personaje ser un valor fraccionario? No hay puntos de código de la mitad o del cuarto.

puede hacer que funcione, primero conviértase a Int32 y luego conviértalo en Doble. Pero, por supuesto, verifique su código y asegúrese de que sea un sentido de la vida que hacer. Los diseñadores de .NET pensaron que no. Tenían razón.

+1

Tiene sentido. Sin embargo, 'double doubleChar = (double) 'a'; // OK' y 'var doubleValue = Convert.ToDouble ('a'); // InvalidCastException' es un poco inconsistente. – oleksii

+0

Hehe, los diseñadores simplemente no tenían el poder para hacer ese lanzamiento. Las reglas del lenguaje prevalecen sobre el diseño del marco. –

2

Cada carácter tiene un número entero correspondiente. Por ejemplo:

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

Supongo que la razón principal por la que no soporta Convert convertir de un char los otros tipos es que la segunda naturaleza de un personaje es el tipo entero.

Tal vez un ejemplo más claro es el siguiente código:

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

Que en realidad no Convert.ToInt32 (pero también plantea la excepción de desbordamiento)

1
+1

Eso realmente no responde la pregunta, dado que 'Convert' tiene muchos métodos de conversión entre tipos que tienen conversiones implícitas entre sí. – Joey

+2

@Joey Realmente responde la pregunta. Sin una sobrecarga 'Convert.ToDouble (char)' para lanzar una excepción, se seleccionaría otra sobrecarga que no arroje una excepción, y 'Convert.ToDouble (char)' ya no se comportaría igual que '((IConvertible) char) .ToDouble() '. – hvd

2

Según MSDN, esta función se mantiene reservado para uso futuro en .Net 2.0 y se mantiene hasta 4.5 para soportar la versión anterior de .NET frameworks.

Lo implementarán si el sistema operativo futuro admitirá este tipo de conversión. Actualmente, el sistema operativo almacena el carácter char como int, por lo que no proporciona la forma de convertir caracteres en dobles debido a muchas conversiones internas.

Debido al formato de almacenamiento interno, la misma limitación es con Convert.ToDouble (DateTime).

Cuestiones relacionadas