3

今晩いくつかのコードをテストする際に、私は素朴にダブルキャストを試してaをに変換し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>は不明ですが、これは無効です。この場合、コンパイラエラーが発生しないのはなぜですか?

4

2 に答える 2

9

クラスは封印されList<T>ていないため、コンパイラはtoからのキャストが無効であることを確認できません。List<T>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 に答える