Cast subclass to superclass - Falscher Type



  • Servus,

    ich habe ein kleines Problem mit dem casten von subclass in die superclass.
    Zum leichteren Einstieg, erstmal ein Code-Snippet:

    class BaseClass
        {
            public string ArticleNumber;
            public string ProductName;
        }
    
        class MyArticle : BaseClass
        {
            public string test;
        }
    

    Normale Vererbung soweit so gut.

    MyArticle a = new MyArticle()
                {
                    ArticleNumber = "3025847563",
                    ProductName = "Schuhe",
                    test = "etc"
                };
    
                Console.WriteLine("MyArticle: " + a.GetType());
    
                BaseClass bc = new BaseClass();
                Console.WriteLine("BaseClass: " + bc.GetType());
    
                bc = (BaseClass) a;
                Console.WriteLine("BaseClass: " + bc.GetType());
    

    Es geht jetzt nur um die letzten beiden Zeilen. Hier bekomme ich immer den Type "Tests.MyArticle". Wobei ich doch einen expliziten cast auf "BaseClass" mache. (Das die Information in der Variable "test" bei diesem cast verloren geht ist mir bewusst.)

    Output:

    MyArticle: Tests.MyArticle
    BaseClass: Tests.BaseClass
    BaseClass: Tests.MyArticle
    

    Laut msdn ist bei "subclass cast to superclass" ein impliziter cast ausreichend - jedoch mit dem gleichen Ergebnis.

    Sehe ich hier etwas falsch? Oder hab ich etwas falsch verstanden?

    Vielen Dank für eure Hilfe.
    Grüße

    mich0r



  • mich0r schrieb:

    Laut msdn ist bei "subclass cast to superclass" ein impliziter cast ausreichend - jedoch mit dem gleichen Ergebnis.

    Klar, der dynamische Typ der referenzierten Instanz ist eben der der Subklasse und dieser wird auch angegeben. Da sich der statische Typ nicht ändert, wäre es - besonders bei Basisklassenreferenzen - sinnlos, diesen anzugeben.



  • Und die Informationen von "test" gehen nicht verloren. Du kannst nur nicht aus der Elternklasse auf sie zugreifen.


Anmelden zum Antworten