Is there any situation where these two if statements will produce different results?
First, note that there are more restrictions on the use of as
than of is
, so x is X
may compile in cases where (x as X) != null
may not. For example, as
requires that the specified type be a reference type or a nullable type; is
works with non-nullable value types as well.
Assume now that both x is X
and (x as X) != null
are valid expressions. According to §7.10.11 of the C# 4.0 specification, "the operation E as T
produces the same result as E is T ? (T)(E) : (T)null
". If we plug that latter expression into (x as X) != null
, we get
(x as X) != null
== ((x is X) ? (X)x : null) != null // by the definition of "as"
== (x is X) ? ((X)x != null) : (null != null) // distribute
== (x is X) ? true : false // because (x is X) implies (x != null)
== x is X
This proves that x is X
and (x as X) != null
are equivalent if both are valid expressions.