1

どうすれば次のようなことができますか?から継承していても、呼び出した後、オブジェクトはnullになり
ます。AGetBAB

class Program
{
    public class A : B
    {
    }

    public class B
    {
    }

    static void Main(string[] args)
    {
        A a = GetB() as A;
        Console.WriteLine(a == null); // it is null!

        Console.WriteLine("Console.ReadKey();");
        Console.ReadKey();
    }
    public static B GetB()
    {
        return new B();
    }
}
4

4 に答える 4

4

あなたはおそらく関数で意味return new A();しました。現時点では、をにダウンキャストしようとしていますBA、これは機能しません。

于 2012-05-09T23:50:34.147 に答える
1

あなたはそれを逆転させました:

class Program
{
    public class A : B  // should be: public class A
    {
    }

    public class B // should be: public class B : A
    {
    }

    static void Main(string[] args)
    {
        // If you reverse the inheritance on code above
        // As Ben Voigt noticed, *as A* is redundant. should be removed
        // A a = GetB() as A; 

        // should be this. B is wider than A, so A can accept B, no need to cast
        A a = GetB(); 
        Console.WriteLine(a == null); // it is null!

        Console.WriteLine("Console.ReadKey();");
        Console.ReadKey();
    }
    public static B GetB()
    {
        return new B();
    }
}
于 2012-05-09T23:52:33.663 に答える
1

このタイプのキャストは、Bうまくいかない可能性があるため、実行できませんA。確かに、AはのサブクラスなBので、いつでもを実行できますGetA() as B;。しかし、逆の方向に進むことは意味がありません。ほとんどの場合、のインスタンスは、のインスタンスにAいくつかの追加機能を提供しますB

3番目のクラスを追加することを検討してくださいC : BGetB()関数が実際にを返した場合はどうなりますnew C()か?なので、これで問題ありませCB。しかし、確かにあなたはこれを?にキャストできるようにしたくないでしょうA?ほぼ確実に共通点はほとんどありませんAC

于 2012-05-09T23:54:12.680 に答える
1

BをAにダウンキャストしようとしています。これはできません。また、BがAになるかどうかわからないため、意味がありません。Aクラスにコンストラクターを作成することをお勧めします。これはパラメータとしてを取りBます。

public class A : B
{
    public A(B b)
    {
        //perform your conversion of a B into an A
    }
}

public class B
{
    public B(){}
}

static void Main(string[] args)
{
    B b = new B();
    A a = new A(b);
    Console.WriteLine(a == null); // it is null!

    Console.WriteLine("Console.ReadKey();");
    Console.ReadKey();
}
于 2012-05-10T00:01:58.720 に答える