转换从数据缓存中检索的列表时出现问题

时间:2009-02-19 19:49:32

标签: c# caching casting list

var listings = new List<FPListing>();

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

投射会抛出此异常

  

无法投射类型的对象   'System.Collections.Generic.List 1[Listings+FPListing]' to type 'System.Collections.Generic.List 1 [编目+ FPListing]'。

根据GetType,它们是相同的类型。我需要采取另一个步骤让演员工作吗?

4 个答案:

答案 0 :(得分:3)

原因是缓存中的对象是使用不同版本的代码创建的,或者是从dll的不同副本加载的相同版本的代码。

要防止错误停止代码,请使用as opreator来转换对象。如果转换失败,它仍将加载缓存中的数据:

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

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

答案 1 :(得分:0)

你确定这条线是否会被逮捕?它可能正在尝试转换为条件的if部分中的赋值语句。

如果您正在讨论HttpContext.Cache,那么您需要添加(Cache.Add())或insert(Cache.Insert())项,而不是通过索引存储它。

调用“缓存[”列表“] =列表”正在尝试使用键“列表”检索对象

您也不必将其声明为新的。试试这个......

List<FPListing>() listings;

答案 2 :(得分:0)

我认为原因是因为编译器无法推断出您明确转换为的类型,即使编译器知道要在原始var语句中推断的类型。

使用“as”键工作。

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

这也是更安全的转换方式,因为如果它不能被转换,它将返回NULL(或默认值(T)) - 而不是抛出异常。

答案 3 :(得分:0)

我怀疑GetFPListings()返回了List的不同衍生物,也许是IList。编译器会将var解释为IList,它将以这种方式缓存,而不能直接转换为List。

但是,这与您的例外情况不符。所以如果你逐字复制了例外,那我就不知道了。