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,它们是相同的类型。我需要采取另一个步骤让演员工作吗?
答案 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。
但是,这与您的例外情况不符。所以如果你逐字复制了例外,那我就不知道了。