2011-08-02 8 views
4

によって作成されたインスタンスに適用される次のコードは、実行時に例外をスローすることがわかったとき、私は驚いた。明示的なキャスト演算子が反射

​​

誰もが私に理由を教えてもらえますか?私は実際に何が起こったのか分かりません

+0

例外メッセージとは何ですか? –

答えて

7

は、あなたは驚かれるべきではありませんので、彼らは、コンパイル時ではない実行時間を選びました。

我々はコードから暗黙の型を削除すると、それはそれは少し明確になります:

object bInstanceReflection = Activator.CreateInstance(typeof (B)); 
Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B 
A aInstanceReflection = (A) bInstanceReflection; 

は、今では最後の行に、(A)は、通常の参照変換を行うobjectからわずかキャストであることを合理的に明らかです。ユーザー定義の変換はまったく適用されません。

は、.NET 4を使用している場合、あなたはそれを動作させるために動的型付けを使用することができます。

// Note the change of type 
dynamic bInstanceReflection = Activator.CreateInstance(typeof (B)); 
Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B 
A aInstanceReflection = (A) bInstanceReflection; 

今、変換がどのような変換の選択を意味し、動的値、上で適用されています使用は実行時まで延期されます。その時点でカスタム演算子が使用されます。

var bInstanceReflection = Activator.CreateInstance(typeof (B)); 

+0

ありがとうジョン、あなた投稿は私にとって非常に便利です! – Alex

3

あなたはBを作成しました。それをAにキャストします。

同様のレイアウトを持つにもかかわらず、Bはコンパイラによって適用されているA.静的事業者とは関係を持っていないではなく、実行時にキャストを経由。 C#の構文は同じですが、リフレクションを扱うときは非常に異なります。

これは正常な動作です。彼ら過負荷、カスタム演算子はないオーバーライド何を行う - -

+0

ありがとうMarc、それは本当に新しいものでした。私も同様の質問にエリックリッペルトの答えを見つけたhttp://stackoverflow.com/questions/2090092/is-there-a-way-to-do-dynamic-implicit-type-casting-in-c – Alex

1

あなたは、単純にこの行を変更することができます

var bInstanceReflection = (B)Activator.CreateInstance(typeof (B)); 

ので、コンパイラは今bInstanceReflectionの種類を知っているし、正しいimpliticオペレーターを呼び出すことができます。

関連する問題