3

给定具有基类B和子类的类层次结构S

class B { }
class S : B { }

我可以通过隐式转换将 a 分配S给a:B

B b = new S();

如果我想将其降级为 aS我必须明确地这样做:

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

现在,我的理解是我们可以保证从Sto始终存在赋值兼容性B,因此我们永远不必以以下方式执行显式向上转换:

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();

除非您将ST实例(或两者)显式转换为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 回答