2009-02-19 5 views
1
var listings = new List<FPListing>(); 

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

Le casting lance cette exceptionProblème coulée une liste récupérée à partir du cache de données

Impossible de jeter l'objet de type 'System.Collections.Generic.List 1[Listings+FPListing]' to type 'System.Collections.Generic.List 1 [Annonces + FPListing].

Qui selon GetType sont des types identiques. Y a-t-il un autre pas que je dois faire pour que le casting fonctionne?

Répondre

0

Etes-vous sûr que c'est la ligne qui recule? Il peut être tentant de jeter dans cette déclaration d'affectation dans la partie if du conditionnel. Si vous parlez de HttpContext.Cache, vous devez ajouter (Cache.Add()) ou insérer (Cache.Insert()) l'élément, pas le stocker par index.

Appel « Cache [ » Listes « ] = » listes tente de récupérer un objet avec la touche « annonces »

Vous ne devez déclarer aussi comme nouvelle. Essayez plutôt ...

List<FPListing>() listings; 
+0

Cache ["Listings"] = listings; est valide, c'est comme ajouter à un dictionnaire. J'ai essayé Cache.Add et j'obtiens le même résultat. – Marshall

+0

Etes-vous toujours en train de le déclarer comme var? – StingyJack

+0

Je l'ai également défini explicitement. Je ne pense pas que cela devrait compter puisque les types sont identiques. – Marshall

0

Je crois que la raison est parce que le compilateur ne peut pas déduire le type que vous transtype explicitement à, même si le compilateur connaît le type de déduire dans la déclaration originale var.

Utilisez plutôt la touche "as".

listings = Cache["Listings"] as List<FPListing>(); 

C'est aussi le plus sûr moyen de coulée ainsi, car il retournera NULL (ou par défaut (T)) si elle ne peut pas être casté - au lieu de lancer une exception.

+0

Ce type de conversion est plus sûr seulement quand il est correct d'obtenir une valeur nulle lorsque la clé est manquante. Une faiblesse de cette approche est quand il y a quelque chose avec la clé, mais d'un type différent. Vous pouvez maintenant vous retrouver avec des exceptions de référence nulles, lorsque vous vouliez vraiment une exception de distribution invalide. –

+0

Null fonctionne pour moi comme exceptions ne fonctionnent pas trop bien sur les sites Web (l'image plus grande). :) – eduncan911

3

La raison en est que l'objet dans le cache a été créé en utilisant une version différente du code, ou la même version du code chargé à partir d'une copie différente de la DLL.

Pour empêcher l'erreur d'arrêter le code, utilisez la commande as opreator pour diffuser l'objet. Si la distribution échoue, il sera toujours charger les données du cache:

List<FPListing> listings = Cache["Listings"] as List<FPListing>; 

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

Semble plausible, mais comment cela peut-il arriver? –

+0

Par exemple si vous recompilez le code et que le cache contient un objet avant la recompilation. – Guffa

0

Je soupçonne que GetFPListings() renvoie un dérivé différent de la liste, peut-être un IList. Le compilateur interpréterait la variable comme une IList qui serait mise en cache de cette façon, qui n'est pas directement convertible en liste.

Toutefois, cela ne correspond pas à votre exception. Donc, si vous avez copié l'exception textuellement, alors je n'en ai aucune idée.

Questions connexes