C# 为什么为空<;日期时间>;可以分配给只能从DateTime隐式转换的参数?
没有从Nullable到DynamoDB的隐式转换进入 但我有这样的代码。它工作得很好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)
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呢?