C# 为什么为空<​;日期时间>;可以分配给只能从DateTime隐式转换的参数?

C# 为什么为空<​;日期时间>;可以分配给只能从DateTime隐式转换的参数?,c#,datetime,nullable,amazon-dynamodb,C#,Datetime,Nullable,Amazon Dynamodb,没有从Nullable到DynamoDB的隐式转换​进入 但我有这样的代码。它工作得很好 class DocumentData { private readonly Document doc; protected void SetValue(string key, DateTime? dateTime) { DateTime? old = GetDateTime(key); if (old != dateTime)

没有从Nullable到DynamoDB的隐式转换​进入 但我有这样的代码。它工作得很好

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 ();
    }
}

好问题。你所描述的是:

class MyClass 
{
    public static implicit operator MyClass(DateTime date)
    {
         return new MyClass ();
    }
}
这是一种隐式的用户定义转换,从不可为null的值类型(此处为
DateTime
)转换为类类型,即引用类型

然后进行转换
DateTime
→<代码>MyClass“诱导”转换
日期时间?
→<代码>我的类就像它看起来的那样

在上述示例中,这将编译:

DateTime? nullableDateTime = XXX;
MyClass myClass = nullableDateTime;  // implicit conversion from nullable!
我试图仔细阅读C#语言规范的一部分,首先是:

用户定义的隐式转换

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

这里源
S
DateTime?
,目标
T
MyClass
。使用规范的符号,
S0
Sx
变成
DateTime
,您编写的转换被“选中”

nullableDateTime
有一个值时,很明显这个值是展开的,然后输入到您的用户定义的转换。这似乎与规范一致

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


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

文档的具体类型是什么?它是DynamoDB的一部分吗?我们可以看看它的文档或源代码吗?它似乎有一个索引器,它接受一个类型为
string
的参数。该索引器的类型真的是
DynamoDBEntry
?我们能看到吗?文档是DynamoDB中的一个类。索引器是动态的。您可以检查源代码。是否存在从不可为空的
DateTime
到DynamoDB条目的转换
运算符
?是的。存在从不可为空的DateTime到DynamoDB项的隐式转换。但是,一个可为null的变量如何隐式转换为DateTime呢?