En C ++ se supone que es falso, mientras que todos los demás valores son verdaderos. Tenía la impresión de que en C # este concepto era el mismo.

Estoy tratando de convertir un char en un bool.

char c = (char)0;
Convert.ToBoolean(c).Dump();

Parece que no importa qué carácter intente convertir, siempre obtengo un error

Reparto no válido de 'Char' a 'Boolean

Entiendo lo que puedo para solucionar esto si escribo mi propia función personalizada, pero lo que estoy tratando de entender es.

¿Cuál es el propósito de este método? ¿Qué valor de Char convierte a Bool?

2
johnny 5 26 oct. 2017 a las 22:10

3 respuestas

La mejor respuesta

Usted dijo:

Tenía la impresión de que en C # este concepto era el mismo.

Estabas equivocado No lo es Los dos idiomas se comportan de manera diferente de esa manera, y simplemente no puede convertir un Char en un Boolean.

La documentación deja en claro que el método siempre falla:

Llamar a este método siempre arroja InvalidCastException.

Y...

Valor de retorno

Tipo: System.Boolean

Esta conversión no es compatible. No se devuelve ningún valor.

Como lo demuestra la fuente de Char.ToBoolean():

[__DynamicallyInvokable]
bool IConvertible.ToBoolean(IFormatProvider provider)
{
    object[] values = new object[] { "Char", "Boolean" };
    throw new InvalidCastException(Environment.GetResourceString("InvalidCast_FromTo", values));
}

Como la clase Char hereda de IConvertible, es necesario proporcionar la sobrecarga. Pero como esta conversión no es posible, siempre se devuelve una excepción.

2
Community 20 jun. 2020 a las 09:12

Solo para mostrar cómo se puede hacer con la palabra clave insegura (similar a c ++). No uses esto ...

char c = (char)0;
unsafe{
    bool b = *((bool *)&c);
}
1
Eser 26 oct. 2017 a las 19:24

¿Cuál es el propósito de este método ...?

De la .NET 2.0 documentación:

Este método está reservado para uso futuro.

Quizás estaban considerando implementarlo en la línea de C ++, pero finalmente decidieron no hacerlo.

EDITAR - IConvertible es no la razón

Parece haber cierta confusión sobre el método char.ToBoolean().

((IConvertible)someChar).ToBoolean(...);

Es un problema separado de Convert.ToBoolean. (¿Por qué primero la conversión explícita? Vea aquí.) El anterior tenía que se implementaría cuando { {X1}} se hizo IConvertible. Esto último podría simplemente no haberse creado, por lo que la pregunta de por qué existe ese método (Convert.ToBoolean) parece responderse solo por compatibilidad con versiones anteriores + la intención original.

(Si soy yo quien malinterpreta esto, por favor hágamelo saber, por supuesto).

1
ispiro 26 oct. 2017 a las 21:09