1


0

データキャッシュから取得したリストのキャストに関する問題
var listings = new List();

if (Cache["Listings"] == null)
{
    listings = GetFPListings(Industry);
    Cache["Listings"] = listings;
}
else
{
    listings = (List)Cache["Listings"];
}

キャストはこの例外をスローします

_ タイプ 'System.Collections.Generic.List`1 [Listings + FPListing]'のオブジェクトをタイプ 'System.Collections.Generic.List`1 [Listings + FPListing]'にキャストできません。 _

GetTypeによると、これは同じ型です。 キャストを機能させるために必要なもう1つのステップはありますか?

4 Answer


3


その理由は、キャッシュ内のオブジェクトが異なるバージョンのコード、または異なるdllのコピーからロードされた同じバージョンのコードを使用して作成されたためです。

エラーがコードを停止しないようにするには、as演算子を使用してオブジェクトをキャストします。 キャストが失敗した場合でも、キャッシュからデータをロードします。

List listings = ListとしてCache ["Listings"];

if(listings == null){listings = GetFPListings(Industry); Cache ["Listings"] = listings; }


0


あなたはそれが冗談だと​​確信していますか? その代入文を条件式のif部分にキャストしようとしている可能性があります。

HttpContext.Cacheについて話しているのであれば、インデックスで格納するのではなく、項目を追加(Cache.Add())または挿入(Cache.Insert())する必要があります。

"Cache [" Listings "] = listings"を呼び出すと、キー "listings"を持つオブジェクトを取得しようとしています

あなたはそれを新しいものとして宣言する必要もありません。 代わりにこれを試してください…​

List()リスト。


0


その理由は、元のvarステートメントで型が推論されることをコンパイラが認識していても、コンパイラが明示的にキャストしている型を推論できないためです。

代わりに "as"キーワークを使用してください。

listings = Cache ["Listings"]をList()としてキャッシュする。

キャストできない場合は、例外をスローする代わりにNULL(またはdefault(T))が返されるため、これも安全なキャスト方法です。


0


GetFPListings()がListの派生物、おそらくIListを返しているのではないかと思います。 コンパイラはvarをそのようにキャッシュされるIListとして解釈します。これはListに直接変換することはできません。

ただし、それはあなたの例外と一致しません。 あなたが例外を逐語的にコピーしたのであれば、私にはわかりません。