繁体   English   中英

C#隐式转换和从Object转换

[英]C# implicit conversion and conversion from Object

有一个class:

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;

对我来说,这是预期的行为,但是是否有任何技巧可以使此特定代码正常工作? (没有投对象到日期)

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

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

转换运算符是根据 static 类型(编译时)解析的,因为它们不是virtual / abstract

您可以使用dynamic (具有使用dynamic的所有含义)来选择加入基于运行时反射的查找。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM