C# 如何将对象强制转换到底面为';更高';?
有两个班。B级由A级改为B级C# 如何将对象强制转换到底面为';更高';?,c#,C#,有两个班。B级由A级改为B级 class A { } class B : A { public B() { } public int Number { get; private set; } } 这给了我一个错误“无法从A转换到B” void Test() { var a = new A(); var b = (B)a; // <== unable to cast. } void测试() { var a=新的a()
class A
{ }
class B : A
{
public B()
{
}
public int Number { get; private set; }
}
这给了我一个错误“无法从A转换到B”
void Test()
{
var a = new A();
var b = (B)a; // <== unable to cast.
}
void测试()
{
var a=新的a();
var b=(b)a;//简单地说,你不能-b
是a
但是a
不是b
你的代码失败是因为你没有b
如果创建的是B而不是a,则可以:
A a = new B();
B b = (B)a;
你可以把A想象成动物
,把B想象成熊
你可以说熊是一种动物,但如果你所拥有的只是一种未知的动物,你就不能把它丢进熊里。只有当它真的是熊的时候,这才有效。你不能——a不是B。简单明了。你不能把基类放入它的派生类中。但是你可以反过来。你不能——a是a,它不是t a B.您不能。您可以做的是在B
中提供一个构造函数,该构造函数将a
作为参数,并在此基础上创建一个新的B
实例:
class B : A
{
public B() { }
public B(A original)
{
// copy values from original to this
}
public int Number { get; private set; }
}
那么你可以这样做
A a = new A();
B b = new B(a);
让我们替换A
和B
,希望能更清楚地说明这一点的不可能性:
class Fruit
{ }
class Apple : Fruit
{ }
class Banana : Fruit
{ }
// If what you wanted to do were possible...
Fruit f = new Apple();
// ...then this should be possible (but how does one magically transform
// an apple into a banana?)
Banana b = (Banana)f;
这就像说这里有一个水果,把它做成一个苹果。@Shade:哦,伙计,在我发布我的答案之前,你真的留下了那个评论吗?现在我觉得自己像个小偷…@Dan Tao是的,你这个混蛋!哈哈,我只是没有留下答案,因为有很多人都有可以接受的答案,我只是喜欢水果。:D:D+1提供解决方案而不是说“你不能".:)此外,@robertpnl,请注意使用派生类B代替父类的实例。这有一些+1。这是唯一的答案,实际上是简洁类比的可能解决方案+1,以及任何进一步的细化。您应该在示例中注意到apple和banana扩展了fruit。您忘记了a苹果
和香蕉
延伸水果@shade:你说得很对。@SwDevMan:是的,是的,我说了。(哇!)