MemoryCacheがInvalidCastExceptionを投げるのはなぜですか -- c# フィールド と caching フィールド と casting フィールド 関連 問題

Why Doesn't MemoryCache throw an InvalidCastException












0
vote

問題

日本語

System.Runtime.Caching ネームスペースのビット用のラッパーとして機能するいくつかの「CacheHelper」関数を含むライブラリーを使用しています。

例えば:

<事前> <コード> 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] を誤って誤ってキャッシュに保存すると、 998876667 がnullを返します。例外はスローされません。 InvalidCastException のようなものを期待していました。なぜですか?

英語

I'm working with a library which contains some 'cacheHelper' functions which act as a wrapper for bits of the System.Runtime.Caching namespace.

For example:

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); } 

All fairly standard stuff. We also have a method to retrieve cached objects:

public static T GetFromCache<T>(string cacheKey) where T : class {     return MemoryCache.Default[cacheKey] as T; } 

I found that if I save an object to the cache as an object of type X and then try and retrieve it from the cache, mistakenly, as an object of type Y, MemoryCache.Default[cachekey] returns null and no exception is thrown. I was expecting something like an InvalidCastException. Can anyone explain why?

</div
        
     
     

回答リスト

2
 
vote
vote
ベストアンサー
 

class boxweight extends boxinfo { boxweight(int a, int b, int c, int w) { super(); ... } } 4 を使用すると、キャストが失敗したときにオブジェクトを 99887776615 に設定しますが、 boxinfo16 も追加する必要があります。 <コード> class boxweight extends boxinfo { boxweight(int a, int b, int c, int w) { super(); ... } } 9 で<コード> class boxweight extends boxinfo { boxweight(int a, int b, int c, int w) { super(); ... } } 8 を使用できないため、 class boxweight extends boxinfo { boxweight(int a, int b, int c, int w) { super(); ... } } 7 を使用できるようになりました。 <コード> boxinfo0 を取得するには、直接キャストを行う必要があります。

<事前> <コード> boxinfo1
 

When you use as it sets the object to null when the cast fails, this is why you also had to add the where T : class to be able to use as because you can't use as on a struct. To get a InvalidCastException you must do a direct cast.

public static T GetFromCache<T>(string cacheKey) //The "where T : class" is no longer needed {     return (T)MemoryCache.Default[cacheKey]; } 
</div
 
 
   
   

関連する質問

1  Javaキャストインタフェースがオブジェクトメソッドを使用しています  ( Java casting interface but using object methods ) 
インターフェイスを介してインスタンス化されたときにオブジェクトのベースメンバーを呼び出す方法についての質問があります。 次のインターフェースと具体的なクラスを持っているとします。 <事前> <コード> public interface UsedClass {...

15  辞書<文字列、文字列>を辞書<string、オブジェクト>に変換するための最も低い方法は何ですか?  ( What is the leanest way to convert a dictionarystring string to a dictionary ) 
Dictionary<string, string> としてキー値コレクションを返すAPIを使用しています。 9988777661 に変換する必要があります。私は、各キー値のペアを介して「手動」なしでこの変換/マッピングを行う方法があると感知しますが、グ...

0  C#列挙をキャストするためのクリーナーな方法  ( Cleaner way to cast a c sharp enum ) 
オブジェクト(私のコントロールではなく、フレームワークによって返されます)、 myField 型 SPNumberFormatTypes myField を使用します。 >。 DisplayFormatの integer 値を XmlAttribute に...

8  void *からタイプ*を入力して* C ++スタイルキャストを使って:static_castまたはreinterpret_cast  ( Cast from void to type using c style cast static cast or reinterpret cast ) 
だから、void *から*に変換*、またはタイプ*からvoid *に変換する場合は、 <事前> <コード> void func(void *p) { Params *params = static_cast<Params*>(p); } または <...

3  c#バインドするときにダウンキャスト  ( C sharp downcasting when binding to and interface ) 
は、ダウンキャスト以外のUIに基本クラスのリストをバインドするためのより良い方法があります。 <事前> <コード> static void Main(string[] args) { List<Animal> list = new List<Ani...

5  このキャスト操作が失敗するのはなぜですか  ( Why does this cast operation fail ) 
この構造体 <事前> <コード> [Serializable] public struct Foo : IConvertible, IXmlSerializable, IComparable, IComparable<Foo> { private re...

76  特定のJava Generics Castsのタイプ安全警告の意味は何ですか?  ( What is the meaning of the type safety warning in certain java generics casts ) 
Java警告の意味は何ですか? 型安全:オブジェクトからリスト&lt;整数&gt;実際に消去されたタイプリストをチェックしています 次のコードのように、オブジェクトを一般的な情報を使ってタイプにキャストしようとすると、この警告が表示されます。 <事前>...

2  MPFRとMPREALでPRINTFを使用する方法  ( How to use printf with mpfr and mpreal ) 
printf とそのCOUSINS 99887665 および 99887666 を使用するための正しい構文は何ですか? mpreal タイプ変数?私は二重のナイーブキャスティングを試みました: <事前> <コード> printf ("... %g ......

2  D.における列挙型 - 安全性  ( Enumeration type safety in d ) 
D?の列挙型の安全性に関する状態と計画は何ですか 私は予想を予想しています <事前> <コード> import std.stdio: writeln; void main(string args[]) { enum E {x, y, z} ...

1  INT64バックアップ・プロシージャー呼び出しのバイトへの強制  ( Int64 coercing to byte in stored procedure call ) 
このようなストアドプロシージャを持っています: <事前> <コード> create procedure [dbo].[Batch_of_Things_Get] (@MaxTimestamp binary(8)) as begin set nocoun...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有