【问题标题】:Why Nullable<​DateTime> can be assigned to a paramter which only can be implict converted from DateTime?为什么 Nullable<​DateTime> 可以分配给只能从 DateTime 隐式转换的参数?
【发布时间】:2013-08-21 06:29:42
【问题描述】:

没有从 Nullable 到 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 ();
    }
}

【问题讨论】:

  • Document 类型到底是什么?它是 DynamoDB 的一部分吗?我们可以看到它的文档或源代码吗?它似乎有一个索引器,它采用string 类型的一个参数。那个索引器的类型真的是DynamoDBEntry吗?我们能看到吗?
  • Document 是 DynamoDB 中的一个类。索引器是 DynamoDBEntry。可以查看源代码here
  • 确实存在从不可为空的DateTime 到 DynamoDB 条目的转换 operator,或者不存在?
  • 是的。存在从不可为空的 DateTime 到 DynamoDB 条目的隐式转换。但是如何将 Nullable 隐式转换为 DateTime?

标签: c# datetime nullable amazon-dynamodb


【解决方案1】:

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

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

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

然后转换DateTimeMyClass“诱导”转换DateTime?MyClass 看起来。

通过上面的例子,编译:

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

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

用户定义的隐式转换

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 2013-06-20
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    相关资源
    最近更新 更多