2017-08-09 70 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保证可用于铸造作业。