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[列表+FPListing]'。1[Listings+FPListing]' to type 'System.Collections.Generic.List
根据 GetType ,它们是相同的类型。我还需要采取其他步骤才能让演员工作吗?
原因是缓存中的对象是使用不同版本的代码创建的,或者是从不同的 dll 副本加载的相同版本的代码。
为了防止错误停止代码,请使用 as 操作符来转换对象。如果转换失败,它仍然会从缓存加载数据:
List<FPListing> listings = Cache["Listings"] as List<FPListing>;
if (listings == null) {
listings = GetFPListings(Industry);
Cache["Listings"] = listings;
}
我相信原因是因为编译器无法推断出您显式转换为的类型,即使编译器知道原始 var 语句中要推断的类型。
请改用“as”键。
listings = Cache["Listings"] as List<FPListing>();
这也是更安全的强制转换方式,因为如果无法强制转换,它将返回 NULL(或 default(T)),而不是抛出异常。
我怀疑 GetFPListings() 返回 List 的不同派生,可能是 IList。 编译器会将 var 解释为 IList,它会以这种方式进行缓存,但不能直接转换为 List。
但是,这与您的例外情况不符。 因此,如果您逐字复制异常,那么我就不知道了。
你确定那条线在犹豫吗?它可能正在尝试在条件的 if 部分中转换该赋值语句。
如果您正在谈论
HttpContext.Cache
,那么您需要添加 Cache.Add()
或插入 Cache.Insert()
该项,而不是按索引存储它。
调用
Cache["Listings"] = listings
正在尝试使用键“listings”检索对象。
您也不必将其声明为新的。试试这个...
List<FPListing>() listings;