不兼容的双重铸造 - 编译器未检测到

时间:2013-03-15 03:56:07

标签: c# casting

今晚在测试一些代码时,我天真地尝试了双重转换,将List转换为IQueryable(注意:我知道.AsQueryable(),请阅读整个问题):

var data = (IQueryable<MyType>)(List<MyType>)Application["MyData"];

我没有考虑这是否有效,但我注意到Visual Studio中没有错误,并且我能够无错误地编译代码,所以我认为它会起作用。但在我发布Web应用程序并去查看页面后,我收到了以下错误(如预期的那样):

  

无法投射类型的对象   'System.Collections.Generic.List`1 [MyType]'到   输入'System.Linq.IQueryable`1 [MyType]'。

尽管在编译时不知道Application["MyData"]的类型,但是我不知道我正在尝试从List<MyType>转换为IQueryable<MyType>,这不是有效?在这种情况下,为什么我没有收到编译器错误?

2 个答案:

答案 0 :(得分:9)

List<T>类没有密封,因此编译器不能确定List<T>IQueryable<T>的强制转换无效。

假设您定义了一个像这样的子类

class QueryableList<T> : List<T>, IQueryable<T>
{
    ...
}

然后演员有效。

答案 1 :(得分:1)

这只是因为IQueryable<T>是一个界面。

var anywayListOfMyType=
    (IWhatsoever)(IFormatProvider)(IIntellisenseBuilder)new List<MyType>();

会编译。

P.S。

IWhatsoever并不存在。