C# 为什么';t MemoryCache抛出一个无效的异常
我正在使用一个库,其中包含一些“cacheHelper”函数,这些函数充当C# 为什么';t MemoryCache抛出一个无效的异常,c#,caching,casting,C#,Caching,Casting,我正在使用一个库,其中包含一些“cacheHelper”函数,这些函数充当System.Runtime.Caching命名空间位的包装器 例如: public bool IsInCache(string keyname){ return MemoryCache[keyname] != null; } public static void SaveToCache(string cacheKey, object savedItem,
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;
}
publicstatict GetFromCache(字符串缓存键),其中T:class
{
返回MemoryCache.Default[cacheKey]为T;
}
我发现,如果我将一个对象作为类型为X的对象保存到缓存中,然后尝试从缓存中检索它,错误地将其作为类型为Y的对象,
MemoryCache.Default[cachekey]
返回null,并且不会引发异常。我希望出现类似于无效的异常情况。有人能解释为什么吗?当您使用as
时,当强制转换失败时,它会将对象设置为null
,这就是为什么您还必须添加where T:class
才能使用as
,因为您不能在结构上使用as
。要获得InvalidCastException
,必须进行直接强制转换
public static T GetFromCache<T>(string cacheKey) //The "where T : class" is no longer needed
{
return (T)MemoryCache.Default[cacheKey];
}
publicstatict GetFromCache(stringcachekey)//不再需要“where T:class”
{
return(T)MemoryCache.Default[cacheKey];
}
当您使用as
时,当强制转换失败时,它会将对象设置为null
,这就是为什么您还必须添加where T:class
才能使用as
,因为您不能在结构上使用as
。要获得InvalidCastException
,必须进行直接强制转换
public static T GetFromCache<T>(string cacheKey) //The "where T : class" is no longer needed
{
return (T)MemoryCache.Default[cacheKey];
}
publicstatict GetFromCache(stringcachekey)//不再需要“where T:class”
{
return(T)MemoryCache.Default[cacheKey];
}
您正在使用“as”关键字。“as”将转换类型,如果不兼容,则返回null。如果你想要一个异常,那么使用一个cast“(T)”,它将出错。请参阅:对于as
,感谢链接,非常有启发性。当然,现在我很难理解为什么任何人都会使用显式转换以外的任何东西。你使用的是“as”关键字。“as”将转换类型,如果不兼容,则返回null。如果你想要一个异常,那么使用一个cast“(T)”,它将出错。请参阅:对于as
,感谢链接,非常有启发性。当然,现在我很难理解为什么任何人都会使用显式演员以外的任何东西。啊。*硬币掉落的声音*。谢谢,这是我从java转换到c#时没有仔细研究过的东西。后续问题:在这个场景中,代码作为库的一部分被访问,您认为使用直接转换而不是作为
更好吗?在我的特殊情况下,花了很长时间才发现我的错误——一条异常消息可能会有所帮助。这取决于库。无论您做什么,只要确保在documentation.Ah.*中指定即可硬币掉落的声音*。谢谢,这是我从java转换到c#时没有仔细研究过的东西。后续问题:在这个场景中,代码作为库的一部分被访问,您认为使用直接转换而不是作为
更好吗?在我的特殊情况下,花了很长时间才发现我的错误——一条异常消息可能会有所帮助。这取决于库。无论您做什么,只要确保在文档中指定即可。