2016-02-10 39 views
0

我正在使用一個庫,其中包含一些'cacheHelper'函數,它們充當System.Runtime.Caching命名空間的位的包裝。MemoryCache爲什麼不拋出InvalidCastException

例如:

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。誰能解釋爲什麼?

+3

您正在使用「as」關鍵字。 「as」將轉換類型,或者如果它不兼容,它將返回null。如果你想要一個異常,那麼使用一個強制轉換「(T)」,它會出錯。 – AndyJ

+2

請參閱:http://stackoverflow.com/questions/132445/direct-casting-vs-as-operator – AndyJ

+1

[文檔](https://msdn.microsoft.com/en-us/library/cscsdfbt.aspx)for '作爲' – juharr

回答

2

當你使用它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]; 
} 
+0

啊。 *便士下降的聲音*。謝謝,這是我從java切換到c#時沒有仔細看過的內容。 後續問題:在這種情況下,代碼作爲庫的一部分被訪問時,你認爲使用直接投射而不是'as'更好嗎?在我的特殊情況下,我花了很長時間看到我的錯誤 - 一個例外信息會有幫助。 – 5arx

+0

這取決於圖書館。不管你做什麼,只要確保在文檔中指定它。 –

相關問題