Bill Wagner gives on his blog a very interesting overview about the Enumerable.Cast<T> operator and why it could throw InvalidCastException in situations you would might not expect. Take a look at his article and you get very interesting insights.
http://srtsolutions.com/blogs/billwagner/archive/2009/07/22/when-cast-lt-t-gt-doesn-t-cast-to-t.aspx