在C#中,我是否必须执行明确的上传?

时间:2012-10-25 09:23:09

标签: c# casting upcasting

给定具有基类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;

这个断言是正确的,还是问题是我是否必须进行明确的上传?

2 个答案:

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

除非您明确地将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