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
。