Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';t MemoryCache抛出一个无效的异常_C#_Caching_Casting - Fatal编程技术网

C# 为什么';t MemoryCache抛出一个无效的异常

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,

我正在使用一个库,其中包含一些“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;
}
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#时没有仔细研究过的东西。后续问题:在这个场景中,代码作为库的一部分被访问,您认为使用直接转换而不是
作为
更好吗?在我的特殊情况下,花了很长时间才发现我的错误——一条异常消息可能会有所帮助。这取决于库。无论您做什么,只要确保在文档中指定即可。