3

在今晚测试一些代码时,我天真地尝试了双重转换以将 a 转换ListIQueryable(注意:我知道.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"]在编译时不知道 of 的类型,难道不知道我正在尝试从 to 强制List<MyType>转换IQueryable<MyType>,这是无效的吗?在这种情况下,为什么我不会收到编译器错误?

4

2 回答 2

9

该类List<T>不是密封的,因此编译器无法确定List<T>to的转换IQueryable<T>是无效的。

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

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

那么演员表是有效的。

于 2013-03-15T03:58:15.217 回答
1

只是因为IQueryable<T>是一个接口。

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

会编译。

ps

IWhatsoever并不存在。

于 2013-03-15T05:13:31.957 回答