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