cli Cast in C# nutzbar machen
-
Ich habe prinzipiell folgende Klassen/Interfaces
public interface class foo { } public ref class bar abstract { public: operator foo^(){ return createNewFoo() } foo^ createNewFoo() { ..... } } public ref class bar2 : public bar { }
nutze ich das ganze aus C++ heraus klappt das auch wunderbar. Also dinge wie
bar^ b = gcnew bar2(); foo^ = b;
funktionieren einwandfrei. Dummerweise nur aus C++ heraus. Es ist aber erforderlich das sowas auch in C# geht. Und genau dort geht der cast immer schief. Was mache ich falsch?
-
Ich vermuta mal, dass du native C Operatorüberladung verwendet hast und keine CLI Kompatible.
http://msdn.microsoft.com/en-us/library/ms235288.aspx
-
Hmm den Beitrag hatte ich auch schon gefunden daher hatte ich sowas gemacht
public interface class foo { public: static operator foo^(bar^ base); static operator foo^(bar2^ base); };
Das müsste ja die cli conforme version sein. Deklariere ich den operator als explizit kommt der fehler C2071 illegal storage class. Irgendwo klappt das ganze also noch nicht.
-
Fedaykin schrieb:
Hmm den Beitrag hatte ich auch schon gefunden daher hatte ich sowas gemacht
public interface class foo { public: static operator foo^(bar^ base); static operator foo^(bar2^ base); };
Das müsste ja die cli conforme version sein. Deklariere ich den operator als explizit kommt der fehler C2071 illegal storage class. Irgendwo klappt das ganze also noch nicht.
Weil das ein Interface ist!
-
warum sollte das ganze nicht für ein interface gehen? Ich kann das interface gerne zu einer abstrakten basisklasse ändern. Mir leuchtet nur nicht ein warum das gewollte nicht mit einen interface klappen soll.
-
public ref class bar abstract
ist das jetzt ein Tippfehler hier im Forum oder fehlt da auch bei Dir im Quelltext das
: foo
-
bar implementiert nicht foo. Kann aber auf foo gecastet werden und soll genau bei diesen cast, ein neues foo objekt mit bestimmten eigenschaften zurück geben. Die diversen ableitungen von bar erstellen dann unterschiedliche objekte welche alle jeweils das foo implementieren.
-
Fedaykin schrieb:
warum sollte das ganze nicht für ein interface gehen? Ich kann das interface gerne zu einer abstrakten basisklasse ändern. Mir leuchtet nur nicht ein warum das gewollte nicht mit einen interface klappen soll.
Jein, ihc habe vorschnell gehandelt: (ich habe nur an dem Interface-Problem festgebissen)
Du möchtest ja schreiben (foo) bar; du kannst also:public ref class bar abstract { public: operator foo^(){ return createNewFoo() } foo^ createNewFoo() { ..... } static operator foo^(bar^ base) { return createNewFoo() } }
schreiben. Ist ja im Grunde auch sinnvoller.
-
Genau das hatte ich auch schon probiert. Das gleiche ergebnis. In C++ mit CLI klappt das wunderbar in C# kommt die InvalidCastException. Im Debugger wird auch nie auf den Cast gesprungen.
-
Aber das ganze scheint echt mit dem interface zusammen zu hängen. Mache ich foo zu einer "ref class abstract" funktioniert das ganze. Sogar implizit. Das war ja das Ziel. Ich soll nun noch rausfinden warum das ganze nicht mit einen Interface geht. Mal schauen ob ich da noch irgendwelche erkenntnisse bekomme.
-
ein kurzer Test (das gleiche prinzip nur in C#) brachte folgenden Fehler hervor: user-defined conversions to or from an interface are not allowed
und damit auch die erklärung für das verhalten im CLI. Hätte der Compiler aber auch vorher anmeckern können.
-
Fedaykin schrieb:
In C++ mit CLI klappt das wunderbar in C# kommt die InvalidCastException. Im Debugger wird auch nie auf den Cast gesprungen.
Ist in den Debugger Optionen so eingestellt: Options > Debugging > Enable Just My Code > Step over Properies and Operators