C#cast类似于C++;重新解释 是否存在C++中的C++重译?

C#cast类似于C++;重新解释 是否存在C++中的C++重译?,c#,casting,C#,Casting,我想知道这是否可行: 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 l

我想知道这是否可行:

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?
    }
}

不,不是。C++中,由于类型不相关,所以您的行为不明确。


C#更紧地握住你的手,禁止这样做。

除非你明确定义如何做,否则这是不可能的。否则编译器将阻止您这样做,因为这将导致引用的不安全处理

为了让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++所期望的,并且会产生额外的开销和内存使用,但是两者都保证为铸造操作工作。我想知道是否可以跨不相关的类型执行强制转换。刚刚找到这个。如果您强制转换到接口,则可以强制转换。奇怪<代码>代码接口I{void f();}类A{}类B{public void f(A A){var B=(I)A;//这很奇怪,但它编译B.f();}代码@user3009098:它编译,因为编译器在编译时没有足够的信息来确定代码是否被破坏(

A
可能是实现
I
A
的子类)。但是它在运行时仍然会失败,因为
a
对象实际上没有实现
I
。这不像是一个
reinterpret\u cast