It is possible for a program with some local variable x:

bool b = x is FooBar;

to assign true to b at runtime, even though there is no conversion, implicit or explicit, from x to FooBar allowed by the compiler! That is,

FooBar foobar = (FooBar)x;

would not be allowed by the compiler in that same program.

The intention of the operator is to determine if the runtime value of x is actually a useful value of the type T, (*) and therefore we add a few additional caveats:
•T may not be a pointer type
•x may not be a lambda or anonymous method
•if x is classified as a method group or is the null literal (**) then the result is false
•if the runtime type of x is a reference type and its value is a null reference then the result is false
•if the runtime type of x is a nullable value type and the HasValue property of its value is false then the result is false
•if the runtime type of x is a nullable value type and the HasValue property of its value is true then the result is computed as though you were checking x.Value is T