为什么 MemoryCache 不抛出 InvalidCastException
本文关键字:InvalidCastException MemoryCache 为什么 | 更新日期: 2023-09-27 18:34:13
我正在使用一个包含一些"cacheHelper"函数的库,这些函数充当System.Runtime.Caching
命名空间位的包装器。
例如:
public bool IsInCache(string keyname){
return MemoryCache[keyname] != null;
}
public static void SaveToCache(string cacheKey, object savedItem,
DateTime absoluteExpiration)
{
var policy = new CacheItemPolicy
{
AbsoluteExpiration = absoluteExpiration,
RemovedCallback = CacheEntryRemovedCallback
};
MemoryCache.Default.Add(cacheKey, savedItem, policy);
}
都是相当标准的东西。我们还有一种方法可以检索缓存的对象:
public static T GetFromCache<T>(string cacheKey) where T : class
{
return MemoryCache.Default[cacheKey] as T;
}
我发现,如果我将一个对象作为 X 类型的对象保存到缓存中,然后尝试从缓存中检索它,错误地将其作为 Y 类型的对象,MemoryCache.Default[cachekey]
返回 null 并且不会引发异常。我期待像InvalidCastException
这样的东西.谁能解释为什么?
当您使用as
时,它会在强制转换失败时将对象设置为null
,这就是为什么您还必须添加where T : class
才能使用as
,因为您不能在struct
上使用as
。要获得InvalidCastException
您必须进行直接投射。
public static T GetFromCache<T>(string cacheKey) //The "where T : class" is no longer needed
{
return (T)MemoryCache.Default[cacheKey];
}