2011-08-02 5 views
2

です。私はすでにこの答えを見つけたので、これはこのサイトには適切だと思うので、質問よりもクイズです。キャスト時に例外がスローされることがありますが、逆参照に続く「as」は

このC#コードは問題なく動作します:

WidgetRef = widget as IWidget; 
WidgetRef.Init(); 

しかし、私はそれを変更しようとした場合:私は例外「のiWidgetにキャストすることはできません」を取得いくつかの状況で

WidgetRef = (IWidget)widget; 
WidgetRef.Init(); 

最初は、2番目の例でキャストできない場合、1番目の例でnull例外がスローされるはずです。しかし、私はそれが必ずしもそうでないことを発見しました:)

これはどのように可能ですか?

+0

[単純なキャストよりもC#の "as"キーワードに重複がありますか?](http://stackoverflow.com/questions/771629/is-there-more-to-the-c-as-keyword -than-simple-casting) – CodeNaked

+4

拡張メソッドである 'Init()'は1つの可能性があります。 – dlev

+0

他の質問はダブじゃないと思います。 WidgetクラスとIWidgetインターフェイスの詳細については、それらの実装方法などの情報を提供する必要があります。 「as演算子は、キャスト式を使用して実行する必要があるユーザー定義の変換などの他の変換は実行できません」というキーワードに注意してください。" – CodeNaked

答えて

0

OK、ここに答えがあります....

そのWidgetRefが変数またはフィールドだったので、私が作っていた間違った仮定が。 NullWidgetは最小限の方法でIWidgetを実装するクラスである

private IWidget _widgetRef; 
    private IWidget WidgetRef 
    { 
     get { return _widgetRef ?? new NullWidget(); } 
     set { _widgetRef = value; } 
    } 

:それは実際にこのように定義されたプロパティでした。だからnullWidgetRefに割り当てられていたにもかかわらず、それはそれから出て来るものではありませんでした!

-1

asオペレータは、キャストを実行できない場合はnullを返します。キーワードは、それがnullにオブジェクトを設定するのではなく、キャストが失敗した場合に例外をスローすることを除いて鋳造キーワードと同じように動作しますようMSDN

+0

Please慎重に質問を読む............. – JoelFan

-1

ザ・上

as演算子。

+0

慎重に質問を読んでください............. – JoelFan

0

私は、ウィジェットオブジェクトを「キャスト可能」ではないコードの残りの部分に何かが起こっていると思います。キャストと "As"は全く同じではありません。おそらく、この記事はあなたにいくつかのアイデアを与えるかもしれません。

http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx

+0

この記事は私の状況には当てはまりません。 *インターフェイスにキャスト* – JoelFan

0

それは全く同じものではありませんので、彼らは別のILを生成します。私はすべてあなたがIWidgetとWidgetRefをどのように定義したかにかかっていると思います。私はあなたに何が起こっているのかを正確に伝えることはできませんでした。

Initは静的メソッドなので、例1では 'as'が例外をスローしないため、これを実行できます。

「いくつかの状況では」例外をスローすると言うので、.Init()ではなくキャストで問題が発生します。

+0

あなたは暖かくなっている.... :) – JoelFan