C#隐式转换和从Object转换

Dee*_*ain 6 .net c# implicit-cast implicit-conversion

有一节课:

public class Date
{
    private DateTime _dateTime;

    public Date(DateTime dateTime)
    {
        _dateTime = dateTime;
    }

    public static implicit operator DateTime(Date d)
    {
        if (d == null)
            return default(DateTime);

        return d._dateTime;
    }

    public static implicit operator Date(DateTime dt)
    {
        return new Date(dt);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,这段代码工作正常:

Date d = DateTime.Now;
DateTime dt=new Date(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

但是此代码不起作用并抛出InvalidCastException"指定的强制转换无效.":

Date d = DateTime.Now;
var obj = (Object)d;
DateTime dt = (DateTime)obj;
Run Code Online (Sandbox Code Playgroud)

对我来说,这是预期的行为,但有没有任何黑客可以让这个特定的代码工作?(没有施放对象到日期)

Ser*_*rvy 8

用户定义的隐式/显式转换运算符是完全编译时构造.编辑器会单独说出一句话,"嘿,这个人正试图在某个地方贴上一个需要吧的Foo.是Foo吧?不,它不是.嗯......哦,我看到了Foo已经定义了一个隐式转换为Bar,我将继续调用该静态转换方法,以便在运行时所有类型都匹配."

运行时不了解隐式/显式转换.程序编译完成后,这些只是常规的静态方法,就像任何其他静态方法一样.由于编译器只能看到从转换DateobjectobjectDate,就永远看不到它需要添加的隐式转换调用的地方.到运行时到达它时,它只看到Date不是a DateTime.