今晚在测试一些代码时,我天真地尝试了双重转换,将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>
,这不是有效?在这种情况下,为什么我没有收到编译器错误?
答案 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
并不存在。