2017-08-09 62 views
-1

C#中的C++ reinterpret_cast是否有相當於?與C++類似的C#cast reinterpret_cast

我想知道這是可能的:

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

如果Y類來自classX – Rise

+0

,那麼可以這樣做。是的。我想知道是否可以在不相關的類型中進行演員陣容。 – user3009098

回答

1

不,它不是。在C++中,你這樣做的行爲是undefined因爲類型不相關。

C#握住你的手更緊,並禁止這一點。

+0

剛發現這個。如果投射到界面,投射是可能的。奇怪的! 'code' interface I { void f(); } 類A { } B類 { 公共無效F(A中的) { 變種B =(I)的; //這很奇怪,但它編譯 b.f(); } } 'code' – user3009098

+1

@ user3009098:編譯時,因爲編譯時沒有足夠的信息讓編譯器知道代碼是否被破壞('A'可能是'A'的子類,它實現'I')。但它在運行時仍會失敗,因爲'a'對象實際上並不實現'I'。這不像'reinterpret_cast'。 –

0

這是不可能的,除非你明確定義如何。否則,編譯器會阻止你這樣做,因爲它會導致對引用的不安全處理。

對於C#知道路該怎麼解釋,你可以做到以下幾點:

無論ClassX必須從ClassY繼承這樣的:

public ClassX : ClassY { } 

或實現運營商這樣做的明確

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

兩者都不完全符合您對C++的期望,並且會產生額外的開銷和內存使用,但是bot h保證可用於鑄造作業。