给定两个类:

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派生的,因此从objectBaseObject的转换被视为典型的向下转换,如果在运行时确定对象不是BaseObject,则失败。

要确定运行时的类型转换,您需要使用dynamic

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


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

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

10-06 10:12