2017-02-03 8 views
0

私は理解できず、答えも見つけられない奇妙な振る舞いに遭遇しました。私に変数がスコープの外に型を持っています

private void SomeMethod(BaseClass obj) 
{ 
    if (obj.GetType() == typeof(SubClass1)) 
    { 
     var variable = (SubClass1) obj; 
    } 

    else if (obj.GetType() == typeof(SubClass2)) 
    { 
     var variable = (SubClass2) obj; 
    } 
} 

variableの2つの宣言が異なるスコープにあるようだとそのvarは、実際の種類に応じてSubClass1またはSubClass2のいずれかで次のようになります。BaseClassSubClass1SubClass2いるサブクラスで、私は方法を持っていますobjが送信されます。

SubClass2のオブジェクトでこのメソッドを呼び出すと、else節のBaseClassからSubClass2へのキャストは常にnullを返します。私はvariable宣言のいずれかに到達する前に、すなわち

私はすぐにメソッドを入力するときにことを確認コードをデバッグ、variableobjリターンのキャストがヌル理由であるofcourceタイプSubClass1です。

variableが宣言される前に誰がその理由を教えてもらえますか?私に

+0

'このメソッドをSubClass2型のオブジェクトで呼び出すと、else節のBaseClassからSubClass2へのキャストは常にnullを返します。これは不可能です。そのような状況では、決して*決して*無効にはなりません。 – Servy

+3

これはデバッガの動作であり、コードではありません。これらは別々のスコープで、異なるタイプの2つの別個の変数です。あなたのコードは別の方法ではコンパイルされませんでした。他に何かが起こっている。 – dasblinkenlight

+0

@Igor型が最初にチェックされるので、コードはキャストに失敗することはありません。 – Servy

答えて

3

variableの2つの宣言が異なるスコープ内にあり、そのvarがメソッドに送らobjの実際のタイプに応じてSubClass1またはSubClass2のどちらかであろうと思われます。

これは正しくありません。 2つの変数があります。タイプはSubClass1で、種類はSubClass2です。どちらも同じ名前になります。変数の型は実行時ではなくコンパイル時に決定されます。あなたのコードが書かれたことに同じです:

private void SomeMethod(BaseClass obj) 
{ 
    if (obj.GetType() == typeof(SubClass1)) 
    { 
     SubClass1 variable = (SubClass1) obj; 
    } 

    else if (obj.GetType() == typeof(SubClass2)) 
    { 
     SubClass2 variable = (SubClass2) obj; 
    } 
} 

あなたのコードは、単純に、このコードのシンタックスシュガーです。変数の型をタイプアウトする必要がなくなり、コンパイラがあなたのためにそれを理解できるようになります。

しかし、私は他の節でBaseClassからSubClass2にキャストタイプSubClass2のオブジェクトでこのメソッドを呼び出すときは常にnullを返します。

これはコードでは不可能です。このようなキャストは、キャストされる値がnullの場合はnullに解決され、コードのその時点でnullの場合はGetTypeでNull参照例外がスローされます。私は方法に入るとすぐに、つまり私はvariable宣言のいずれかに達する前にいることがわかりコードをデバッグするとき

variable

という名前の最初の変数[...]タイプSubClass1でありますvariableのタイプはSubClass1です。 2番目のタイプはSubClass2です。これは、コンパイル時にこれらの変数の型を定義したものです。

objのキャストがnullを返すのは、その原因が原因です。

先に述べたように、それはnullその結果ないです。それはできません。変数が正しいタイプのものでない場合コードはコンパイルされません;実行時に値が変更されることはありません。

variableが宣言される前に誰がその理由を教えてもらえますか?

すべての変数のタイプは、コンパイルするときに宣言した行で決定されます。

+0

私はすべてのステートメントで同意する準備ができています。しかし今、実際には私は実際に別の振る舞いを経験し、答えは "それはできません"とは何も助けません – user613068

+0

@ user613068あなたが見ていると主張しているものを見ていないか、あなたのコードはあなたが示したコードとは異なります。 – Servy

関連する問題