From the C# language specification:
7.10.10 The is operator
The is operator is used to dynamically check if the run-time type of an object is compatible with a given type. The result of the operation E is T, where E is an expression and T is a type, is a boolean value indicating whether E can successfully be converted to type T by a reference conversion, a boxing conversion, or an unboxing conversion. The operation is evaluated as follows, after type arguments have been substituted for all type parameters:
• If E is an anonymous function, a compile-time error occurs
• If E is a method group or the null literal, of if the type of E is a reference type or a nullable type and the value of E is null, the result is false.
• Otherwise, let D represent the dynamic type of E as follows:
o If the type of E is a reference type, D is the run-time type of the instance reference by E.
o If the type of E is a nullable type, D is the underlying type of that nullable type.
o If the type of E is a non-nullable value type, D is the type of E.
• The result of the operation depends on D and T as follows:
o If T is a reference type, the result is true if D and T are the same type, if D is a reference type and an implicit reference conversion from D to T exists, or if D is a value type and a boxing conversion from D to T exists.
o If T is a nullable type, the result is true if D is the underlying type of T.
o If T is a non-nullable value type, the result is true if D and T are the same type.
o Otherwise, the result is false.
Note that user defined conversions, are not considered by the is operator.
The crucial part is probably "D is the run-time type of the instance reference by E": in C# every reference type has a Type
field that contains the type.
All valid implicit reference conversions are defined in 6.1.6:
The implicit reference conversions are:
• From any reference-type to object and dynamic.
• From any class-type S to any class-type T, provided S is derived from T.
• From any class-type S to any interface-type T, provided S implements T.
• From any interface-type S to any interface-type T, provided S is derived from T.
• ...
There are a few more, but these are the most important conversions.