1

没有从 Nullable<​DateTime> 到 DynamoDB​Entry 的隐式转换。但我有这样的代码。它运作良好。

class DocumentData {
    private readonly Document doc;

    protected void SetValue(string key, DateTime? dateTime)
    {
        DateTime? old = GetDateTime(key);
        if (old != dateTime)
            doc[key] = dateTime;
    }
}

事实上,我测试了一些其他代码。我认为这与 DynamoDB 无关。

class TestDateTIme
{           
    public static void Test() { 
        DateTime? a = DateTime.UtcNow;
        Convert(a);
    }
    public static void Convert(MyClass m){
        return;
    }
}

class MyClass 
{
    public static implicit operator MyClass(DateTime date)
    {
         return new MyClass ();
    }
}
4

1 回答 1

2

好问题。你描述的是这样的:

class MyClass 
{
    public static implicit operator MyClass(DateTime date)
    {
         return new MyClass ();
    }
}

这是从不可为空的值类型(此处DateTime)到类类型(引用类型)的隐式用户定义转换。

然后转换DateTime→<code>MyClass “诱导”转换DateTime?→<code>MyClass 看起来。

使用上面的例子,编译:

DateTime? nullableDateTime = XXX;
MyClass myClass = nullableDateTime;  // implicit conversion from nullable!

我试图仔细阅读 C# 语言规范的部分,开头是:

用户定义的隐式转换

用户定义的从类型S到类型T的隐式转换处理如下:[...]

这里源SDateTime?,目标TMyClass。使用规范的符号,S0Sx成为DateTime您编写的转换是“选定的”。

nullableDateTime有一个值时,很明显这个值是解包的,然后提供给你的用户定义的转换。它似乎与规范一致。

nullableDateTime没有值(为空)时,看起来结果myClass变成了null该类型的 a,即null类类型的引用。这是基于实验的。我不确定规范中的何处null描述了从结构到类的这种行为。

结论:您询问的行为可能是规范编写方式的结果,但我不确定如果不实际调用您的转换方法,它null应该去哪里。null

于 2013-08-22T19:38:03.217 回答