有一个课程:
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;
对我来说,这是预期的行为,但有没有任何黑客可以使这个特定的代码工作? (没有施放对象到日期)
答案 0 :(得分:8)
用户定义的隐式/显式转换运算符是完全编译时构造。编辑器会单独说一句话,“嘿,这个人试图在某个地方贴上一个期待酒吧的Foo。是Foo吧?不,它不是。嗯......哦,我看到Foo已定义了对Bar的隐式转换,我将继续调用该静态转换方法,以便在运行时所有类型都匹配。“
运行时不了解隐式/显式转换。程序编译完成后,这些只是常规的静态方法,就像任何其他静态方法一样。由于编译器只能看到从Date
到object
以及从object
到Date
的转换,因此它永远不会看到需要添加隐式转换调用的位置。到运行时到达它时,它只会看到Date
不是DateTime
。