Me di cuenta de que este operador is los mismos resultados e incluso compila lo mismo (ver esta esencia ) que el operador == . ¿Es este un uso correcto del operador is dado que solo puedo ver cosas relacionadas con la prueba de tipos en tiempo de ejecución en los documentos?
bool test = false; if(!test) { // some code } //OR if(test is false) { // some code }Es válido porque es parte de la función de coincidencia de patrones. Pero como @Jon Skeet ya respondió, no es convencional usarlo para verificar la igualdad con las variables booleanas. En C# 9, su caso de uso común es comprobar varias condiciones a la vez, como
int x = Random.Next(50); if (x is >5 and <17) //do somethingSin embargo, es azúcar sintáctico principalmente.
Sí, es completamente válido, es un patrón constante . En ese sentido, es "correcto". No es un detalle de implementación o un error por parte del compilador.
Sin embargo, es bastante poco convencional usarlo de esta manera dentro de una declaración if : los patrones constantes se usan más comúnmente en declaraciones o expresiones de cambio.
Sin embargo, no son completamente equivalentes. La coincidencia de patrones con is no realiza conversiones personalizadas en el lado izquierdo del operador is . Así que toma este ejemplo:
using System; using System.Text; struct MyBool { public bool Value { get;} public MyBool(bool value) => Value = value; public static implicit operator bool(MyBool value) => value; } class Test { static void Main() { MyBool x = new MyBool(true); // Valid: uses the implicit conversion from MyBool to bool Console.WriteLine(x == true); // Invalid Console.WriteLine(x is true); } }El mensaje de error de la última declaración es quizás un poco confuso:
error CS0029: no se puede convertir implícitamente el tipo 'bool' a 'MyBool'
Eso se debe a esta parte del comportamiento del patrón constante :
Cuando el valor de entrada no es un tipo abierto, la expresión constante se convierte implícitamente al tipo de la expresión coincidente; si el tipo del valor de entrada no es compatible con el patrón con el tipo de la expresión constante, la operación de coincidencia de patrón es un error.
Curiosamente, si agrega una conversión de bool a MyBool , el error cambia:
error CS0150: Se espera un valor constante
Pero fundamentalmente no es válido, de todos modos.