2009-08-27 18 views
6
if(myVariable is SomeType) 

De la nada más que la curiosidad, ¿qué es lo opuesto a eso? Quiero hacer algo como:¿Qué es lo opuesto a "es"?

if(!myVariable is SomeType) 
if(myVariable is not SomeType) 

Ni compilar.

Dado que "es" es una palabra que no se puede buscar en la mayoría de los motores, ha sido difícil encontrar una respuesta.

duplicado:

C# : ‘is’ keyword and checking for Not

+0

Por lo general, aún puede buscar "es" en un motor de búsqueda si lo hace * + "es" * en su consulta de búsqueda al requerir que coincida con. – Alex

+3

no es, por supuesto, – DLauer

Respuesta

28

Trate

if (!(myVariable is SomeType)) 
+0

The! debe estar dentro del soporte. if (! (myVariable es SomeType) – Brandon

+0

Esa es la respuesta correcta – Maciek

2

no estoy delante de un compilador en este momento por lo que no se puede comprobar, pero que no

if (!(myVariable is SomeType)) 

¿funciona?

7

Debe rodear la instrucción entre paréntesis.

if (!myVariable is SomeType) 

Esa línea aplica el operador NOT a myVariable, no toda la instrucción. Pruebe:

if (!(myVariable is SomeType)) 

Aunque, sería cauteloso con el código que comprueba un objeto para su tipo de todos modos. Es posible que desee examinar el concepto de polimorfismo.

+1

+1 para el comentario de polimorfismo. Tal vez Deane no lo necesita, pero es bueno tenerlo cerca de un código como este. –

+0

Es bastante común comprobar para ver si un objeto es de cierto tipo. El constructo foreach lo hace para ver si el enumerador implementa IDisposable. –

+0

no debería ser muy común en tu código. No hay muchas tareas en C# que requieran el uso de verificar el tipo explícitamente en lugar de usar polimorfismo. No digo que no sea válido en algunas situaciones, pero no debería ser "común". –

4

Jay y Marc tienen toda la razón. Como alternativa, puede hacer:

var cast = myVariable as SomeType; 
if(cast == null) 
{ 
    // myVariable is not SomeType 
} 

La ventaja de este método es que ahora tiene una variable que ya emitidos como SomeType inmediatamente disponible para su uso.

0

O qué tal una extensión genérica? Prefiero esta forma de evitar tener tantos paréntesis.

Así que tienes:

if (!MyObject.Is<string>()) 
    //Do blah blah blah 

Usando:

public static class ObjectExtensions 
{ 
    public static bool Is<T>(this object ToEvaluate) 
    { 
     return ToEvaluate is T; 
    } 
} 

que parece más fácil de leer también.

Cuestiones relacionadas