lenguaje bool c# .net casting

c# - bool lenguaje c



¿Cómo puedo lanzar de forma segura un System.Object a un `bool` en C#? (7)

Hay dos opciones ... con un rendimiento ligeramente sorprendente:

  • Verificación redundante:

    if (rawValue is bool) { bool x = (bool) rawValue; ... }

  • Usando un tipo que admite nulos:

    bool? x = rawValue as bool?; if (x != null) { ... // use x.Value }

La parte sorprendente es que el rendimiento de la segunda forma es mucho peor que el primero .

En C # 7, puede usar la coincidencia de patrones para esto:

if (rawValue is bool value) { // Use value here }

Tenga en cuenta que todavía termina con un value en el alcance (pero no definitivamente asignado) después de la instrucción if .

Estoy extrayendo un valor bool de una colección (no genérica, heterogénea).

El operador as solo se puede usar con tipos de referencia, por lo que no es posible usarlo as para intentar una conversión segura a bool :

// This does not work: "The as operator must be used with a reference type (''bool'' is a value type)" object rawValue = map.GetValue(key); bool value = rawValue as bool;

¿Hay algo similar que pueda hacerse para lanzar un objeto con seguridad a un tipo de valor sin posibilidad de una InvalidCastException si, por alguna razón, el valor no es un booleano?


Me gusta esto:

if (rawValue is bool) { bool value = (bool)rawValue; //Do something } else { //It''s not a bool }

A diferencia de los tipos de referencia, no hay una forma rápida de intentar convertir a un tipo de valor sin dos conversiones. (O un bloque catch, que sería peor)


No has definido lo que quieres que suceda si rawValue no es convertible a bool. Las opciones comunes son devolver falso, nulo o lanzar una excepción. También existe la posibilidad de que la representación de cadena de rawValue sea convertible a bool, como Sí / No, Verdadero / Falso, 1/0, etc.

Yo usaría bool.TryParse para hacer la conversión. Esto tendrá éxito si rawValue es un bool o su valor de cadena es "True" o "False".

bool result; if (!bool.TryParse(rawValue as string, out result)) { // you need to decide what to do in this case }


Puedes lanzarlo a un bool? con la palabra clave as y verifique la propiedad HasValue .


Siempre que no sea necesario que guarde una referencia al valor rawValue , aquí hay una línea que usa el método GetValueOrDefault() de la Nullable<T> :

bool value = (map.GetValue(key) as bool?).GetValueOrDefault();

También puede especificar un valor predeterminado utilizando el método de sobrecarga GetValueOrDefault(T) .


También puedes probar Convert.ToBoolean (rowValue);


bool value; if(rawValue is bool) value = (bool)rawValue; else { // something is not right...