C# 如何将对象强制转换到底面为';更高';?

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

有两个班。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();

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:是的,是的,我说了。(哇!)