给定具有基类B
和子类S
的类层次结构:
class B { }
class S : B { }
我可以使用隐式转换为S
分配B
:
B b = new S();
如果我想将其转发回S
,我必须明确地这样做:
B b = new S();
...
S s = (S)b;
现在,我的理解是,我们可以保证从S
到B
始终存在分配兼容性,因此我们永远不必以下列方式执行显式上传:
S s = new S();
B b = (B)s; // or
B b2 = s as B;
这个断言是正确的,还是问题是我是否必须进行明确的上传?
答案 0 :(得分: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
答案 1 :(得分: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