使用隐式运算符重载进行转换

时间:2014-12-03 16:01:23

标签: c# casting implicit-conversion

给出两个类:

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

1 个答案:

答案 0 :(得分:3)

在编译时已知源和目标类型时,也会在编译时确定强制类型。在这种情况下,BaseObject派生自object,因此从objectBaseObject的转换被视为典型的向下转换,如果在运行时确定该对象,则会失败不是BaseObject

要确定运行时的强制类型,您需要使用dynamic

dynamic obj = new Some();
var baseObject = (BaseObject)obj; // works

或如果obj的声明无法更改,

object obj = new Some();
var baseObject = (BaseObject)(dynamic)obj; // also works