C#隐式转换和从Object转换

时间:2014-03-07 15:47:29

标签: c# .net implicit-conversion implicit-cast

有一个课程:

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);
    }
}

所以,这段代码运行正常:

Date d = DateTime.Now;
DateTime dt=new Date(DateTime.Now);

但是这段代码不起作用并抛出InvalidCastException“指定的强制转换无效。”:

Date d = DateTime.Now;
var obj = (Object)d;
DateTime dt = (DateTime)obj;

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

1 个答案:

答案 0 :(得分:8)

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

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