给出两个类:
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
。
答案 0 :(得分:3)
在编译时已知源和目标类型时,也会在编译时确定强制类型。在这种情况下,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