【问题标题】:C# implicit conversion and conversion from ObjectC# 隐式转换和从 Object 的转换
【发布时间】:2014-03-07 15:47:28
【问题描述】:

有一个类:

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 "Specified cast is not valid.":

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

对我来说,这是预期的行为,但是否有任何 hack 可以使这个特定代码工作? (没有将 obj 转换为 Date)

【问题讨论】:

  • 使用dynamic(将obj更改为动态而不是对象),或将obj转换为Date是我能想到的唯一选项。

标签: c# .net implicit-conversion


【解决方案1】:

用户定义的隐式/显式转换运算符是一个完全编译时的构造。编译器会单独说出以下几行内容:“嘿,这个人试图将 Foo 粘贴到需要 Bar 的地方。Foo 是 Bar 吗?不,不是。嗯……哦,我看到了 Foo已经定义了对 Bar 的隐式转换,我将继续调用该静态转换方法,以便在运行时匹配所有类型。”

运行时不知道隐式/显式转换。当程序完成编译时,这些只是常规的静态方法,就像任何其他静态方法一样。由于编译器只看到从Dateobject 和从objectDate 的转换,它永远看不到需要添加隐式转换调用的地方。当运行时到达它时,它只发现Date 不是DateTime

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多