3

B基本クラスとサブクラスを持つクラス階層が与えられた場合S

class B { }
class S : B { }

暗黙の変換でをSに割り当てることができます:B

B b = new S();

これをダウンキャストしたい場合Sは、明示的にこれを行う必要があります。

B b = new S();
...
S s = (S)b;

さて、私の理解では、からSBの割り当ての互換性が常にあることを保証できるので、次のように明示的なアップキャストを実行する必要はありません。

S s = new S();
B b = (B)s; // or
B b2 = s as B;

この主張は正しいですか、それとも質問にあるように、明示的なアップキャストを実行する必要がありますか?

4

2 に答える 2

4

クラスに明示的な実装がある場合は、インターフェイスを使用できます。

interface I {
    void Method();
}

class C : I {
    void I.Method() { ... }
}

C c = new C();
c.Method();      // won't compile
((I)c).Method(); // have to cast to I first
于 2012-10-25T09:38:55.583 に答える
3

あなたが持っている場合

class B { }
class S : B { }
class T : B { }

そしてあなたは次のようなことをしようとします

var b = myBool ? new S() : new T();

SまたはTインスタンス(または両方)をに明示的にキャストしない限り、これはコンパイルされませんB

同じことが匿名メソッドにも当てはまります。これ

new bool[0].Select(b => 
    { if (b) { return new S(); } else { return new T(); } });

キャストなしではコンパイルされません(または指定Select<bool, B>しますが、ソースが匿名タイプの場合など、これは不可能な場合があります)。

また、あなたが持っている場合

class B { public void DoSomething() { } }
class S : B { public new void DoSomething() { } }

それから

S s = new S();
s.DoSomething();       // calls the S version
((B)s).DoSomething();  // calls the B version
于 2012-10-25T09:36:05.470 に答える