Las demás respuestas contienen omisiones importantes.
El operador is
hace no de verificación si el tipo de ejecución del operando es exactamente tipo dado; más bien, se comprueba si el tipo de tiempo de ejecución es compatible con tipo dado:
class Animal {}
class Tiger : Animal {}
...
object x = new Tiger();
bool b1 = x is Tiger; // true
bool b2 = x is Animal; // true also! Every tiger is an animal.
Pero la comprobación de tipo identidad con cheques de reflexión para identidad, no para compatibilidad
bool b3 = x.GetType() == typeof(Tiger); // true
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal
Si eso no es lo que quiere, entonces es probable que desee IsAssignableFrom:
bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
Si bien el enfoque final que se muestra aquí funciona, es innecesariamente detallado. 'typeof (Animal) .IsInstanceOfType (x)' es más corto y más directo que 'typeof (Animal) .IsAssignableFrom (x.GetType());' (y Resharper sugerirá usar el primero si usa el último). –