2017-08-09 4 views
-1

Gibt es in C# ein Äquivalent von C++ reininterpret_cast?C# -Ausdruck analog zu C++ reinterpret_cast

Ich möchte wissen, ob dies möglich ist:

class ClassX 
{ 
    public void X() { } 
} 

class ClassY 
{ 
    public void Y() { } 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     ClassX x = new ClassX(); 
     ClassY y = (ClassY)x; // is it possible to cast like this? 
    } 
} 
+1

können Sie das tun, wenn die Klasse Y von der Klasse X abgeleitet ist – Rise

+0

Ja. Ich möchte wissen, ob eine Besetzung über nicht verwandte Arten erfolgen kann. – user3009098

Antwort

1

Nein, es ist nicht. In C++ ist das Verhalten auf Ihrem Weg undefined, da die Typen nicht verwandt sind.

C# hält Ihre Hand fester und verbietet dies.

+0

Gerade gefunden. Casting ist möglich, wenn Sie auf eine Schnittstelle umstellen. Seltsam! 'code' Schnittstelle I { void f(); } Klasse A { } Klasse B { public void f (A a) { var b = (I) a; // das ist seltsam, aber es kompiliert b.f(); } } 'code' – user3009098

+1

@ user3009098: es kompiliert, weil es nicht genügend Informationen zur Kompilierzeit für den Compiler gibt, um sicher zu wissen, dass der Code kaputt ist (das' A' könnte eine Unterklasse von 'A' sein, das implementiert "Ich"). Aber es wird immer noch zur Laufzeit versagen, weil das 'a'-Objekt tatsächlich nicht'I' implementiert. Das ist nichts wie ein 'reininterpret_cast'. –

0

Es ist nicht möglich, es sei denn, Sie definieren explizit wie. Andernfalls wird der Compiler Sie daran hindern, da dies zu einer unsicheren Behandlung von Referenzen führen würde.

Für C# eine Möglichkeit zu wissen, wie zu interpretieren, dass man wie folgt vorgehen:

Entweder ClassX von ClassY wie folgt erben müssen:

public ClassX : ClassY { } 

Oder einen Operator implementieren zu tun, so explizit

public ClassX 
{ 
    public static explicit operator ClassY(ClassX x) 
    { 
     return new ClassX() // and implement how to convert it here. 
    } 
} 

Beide tun nicht genau das, was Sie von C++ erwarten würden, und schaffen zusätzliche Overhead- und Speichernutzung, jedoch Bot h wird garantiert für eine Gießoperation arbeiten.