给定两个类:
class BaseObject
{
}
class Some
{
public static implicit operator BaseObject(Some d)
{
Console.WriteLine("Some.implicit");
return new BaseObject();
}
}
我需要能够使用隐式运算符重载从
object
(实际上是Some
)转换为BaseObject
。我使用了显式强制转换,但是由于InvalidCastException
的原因,它不起作用:object obj = new Some();
var baseObject = (BaseObject)(obj); // InvalidCastException here
更新资料
对于那些不了解隐式强制转换的人。这有效:
Some obj = new Some();
BaseObject baseObject = obj; // writes "Some.implicit"
问题是我收到
obj
作为object
。 最佳答案
当在编译时知道源类型和目标类型时,也可以在编译时确定类型转换。在这种情况下,BaseObject
是从object
派生的,因此从object
到BaseObject
的转换被视为典型的向下转换,如果在运行时确定对象不是BaseObject
,则失败。
要确定运行时的类型转换,您需要使用dynamic
。
dynamic obj = new Some();
var baseObject = (BaseObject)obj; // works
或者如果
obj
的声明无法更改,object obj = new Some();
var baseObject = (BaseObject)(dynamic)obj; // also works