2012-10-25 23 views
3

给定一个类层次结构与基础类B和子类S在C#中,我是否必须执行显式上传?

class B { } 
class S : B { } 

我可以指定一个SB与隐式转换:

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; 

是这句话很正确,或作为问题状态我是否必须执行显式预测?

+0

如果您是有意向上转型对象在你的代码库中的任何地方,我想你会打破Liskov替代原则的定义。 – MarioDS

回答

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 
+0

我不知道调用基础版本的演员阵容,我认为它可能是这样的情况,但去了调查,它[它似乎不是](http://stackoverflow.com/questions/437926/force-calling-基于方法的派生类) –

+0

@JamesB它不适用于虚拟方法,但它适用于被'new'隐藏的方法。 – Rawling

+0

啊,没有发现! –

4

你可能会与界面做的,如果类已经得到了明确的实现:

​​
相关问题