2017-12-26 51 views
-2

objectのオブジェクトを持っていますが、GetType()を呼び出すと、1つのケースではHashSet<Availability>の型が返されますが、返されます。別の場合にはHashSet<Contact>の無関係型、または未知数の任意の数のHashSet<...>型である。C#では、オブジェクト型を汎用型オブジェクトのコレクション型にアップキャストできます

object myObject = getMyObject(); 
myObject.GetType() // = HashSet<Availability> 

コードがしたままのを知っている必要はないように私は、オブジェクトにコレクションのジェネリック型をキャストダウンしながら、いくつかの種類(HashSetのか、他)のコレクションにオブジェクトをキャストしたいと思いますコンパイル時には未知の型です。

object myObject = getMyObject(); 
myObject.GetType() // = HashSet<Availability> 
var myUsefulObject = (HashSet<object>)myObject; 

これを試してみると、「キャストできません...」という例外が発生しています。

これは可能ですか? そうなら、どうですか?

は、私は私が持っているHashSetのタイプと私が欲しい1間の共分散を持っていると信じていたが、私の初期タイプが唯一のオブジェクトであるので、私はthis stack-overflow answer suggests何をすることができません。

+3

*これは可能ですか?* - いいえこれはすべての夢です。コンパイラは、共分散についてのあなたの信念が間違っていることを実際には伝えておらず、あなたがやっていることは根本的にあなたがリンクしている答えとは根本的に異なっていることは無関係です。 –

+1

見て、 'HashSet 'を 'HashSet 'にキャストできたとします。次に、これを行うことができます: '(新しいHashSet ()としてHashSet ).Add(" LOL ")'。それは良いアイデアのように見えますか? –

+0

また、*なぜ*これをしたいですか?最終目標は何ですか? –

答えて

0

あなたの質問の中の長いコメントの通り、HashSet<Availability>HashSet<object>にキャストすることはできません。これらの2つのタイプの間に暗黙的な\明示的\その他の変換は定義されていないからです。しかし、HashSet<T>は、IReadOnlyCollection<T>IEnumerable<T>など、いくつかの共変のインターフェイスを実装し、あなたは(objectの)これらのインタフェースにHashSet<Availability>をキャストすることができます

object myObject = getMyObject(); 
var myUsefulObject = (IReadOnlyCollection<object>)myObject; 

タイプTがインタフェースに共変である場合 - このタイプはで引数として使用することはできませんそのインタフェース内の任意のメソッドであり、戻り型としてのみ使用できます。これは、この場合、型安全性を損なう可能性のあるメソッド(Add(T item),Remove(T item)など)がこのようなインターフェイスに存在しないことを意味し、Availabilityobjectとして返しても問題ありません。

関連する問題