基本上我想这样做。aa 导致错误的强制转换异常。
注意:o 可以是任何东西。它可能不是 B,它可以是 C、D、E、F 等。但只要 o 是一个可以类型转换为 A 的类(B 就是这样一个类。它使用隐式运算符重载),这应该可以工作
var b = (B)"sz";
var a = (A)b;
object o = b;
var aa = (A)o;
基本上我想这样做。aa 导致错误的强制转换异常。
注意:o 可以是任何东西。它可能不是 B,它可以是 C、D、E、F 等。但只要 o 是一个可以类型转换为 A 的类(B 就是这样一个类。它使用隐式运算符重载),这应该可以工作
var b = (B)"sz";
var a = (A)b;
object o = b;
var aa = (A)o;
您是否尝试过执行以下操作?
[...]
var ee = (A)(B)o;
这将起作用而您的代码不起作用的原因是这种显式转换是静态编译的。换句话说,当您说(A)o
编译器查找从对象到的显式转换时A
,却找不到。但是,它确实确定这A
是 object 的子类,因此强制转换在运行时可能是可行的 - 并且它插入了运行时将实例向下强制转换为 type 的字段的尝试A
。这种运行时强制转换与显式和/或隐式转换无关;这些只是遵循内置的类型层次结构规则。
另一个例子:
object o = 1.0;
int i = (int)o; //throws InvalidCastException - even though (int)1.0 is OK.