为什么MemoryCache没有抛出InvalidCastException

时间:2016-02-10 17:30:45

标签: c# caching casting

我正在使用一个包含一些'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这样的东西。任何人都可以解释原因吗?

1 个答案:

答案 0 :(得分:2)

当您使用Session.setTimeout()时,它会在投射失败时将对象设置为as,这就是为什么您还必须添加null才能使用where T : class因为您无法在as上使用as。要获得struct,您必须进行直接投射。

InvalidCastException