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

mel*_*okb 3 c# casting

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

var data = (IQueryable<MyType>)(List<MyType>)Application["MyData"];
Run Code Online (Sandbox Code Playgroud)

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

无法将类型为'System.Collections.Generic.List`1 [MyType]'的对象强制转换为'System.Linq.IQueryable`1 [MyType]'.

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

p.s*_*w.g 9

List<T>班是不是密封的,所以编译器无法确定从投List<T>IQueryable<T>是无效的.

假设您定义了这样的子类

class QueryableList<T> : List<T>, IQueryable<T>
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后演员阵容有效.