动态不尊重返回类型

时间:2016-01-12 23:54:40

标签: c#

我是C#dynamic关键字的新手。在我的一个项目中,我尝试使用它并遇到了一些意想不到的行为。我设法使用以下代码重现这种情况:

class Program
{
    static DateTime? DateOnly(DateTime? time)
    {
        return time.HasValue ? (System.DateTime?)time.Value.Date : null;
    }

    static void Main(string[] args)
    {
        dynamic now = System.DateTime.Now;
        var date = DateOnly(now);
        Console.WriteLine(date.Value); // error thrown here
        Console.Read();
    }
}

我得到RuntimeBinderException

  

'System.DateTime'不包含'Value'的定义。

因此变量date被视为DateTime而不是DateTime?

看起来dynamic忽略了返回类型声明。 我应该避免将vardynamic一起使用吗?

3 个答案:

答案 0 :(得分:5)

因为您将dynamic变量传递给DateOnly方法,所以返回类型也变为动态。因此,在这种情况下,您的var date实际上是dynamic date。它包含一个盒装的可空DateTime,但拳击不会保留" nullable"部分,所以实际上它只是一个盒装DateTime,它没有Value属性。所以你应该Console.WriteLine(date)来打印这个值。

正如你所看到的,可空类型和dynamic并不能很好地发挥作用......

答案 1 :(得分:2)

有两个问题。一个是>>> ''.join(''.join(item) for item in zip(u,l)) 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz' 仍然是动态的,因为右侧是动态表达式。如果您使用特定类型date声明date,则不会看到此内容。另一个问题是你返回一个可以为空的值类型,转换为动态被认为是拳击。可空值的类型永远不会被装箱。底层值类型是解包的,因此DateTime?的行为更类似于date类型的引用,它可以具有DateTime或可以为null,而不是对object的引用。然后绑定程序尝试针对DateTime解析属性DateTime?并失败。如果你尝试Value,它会失败,因为该方法有很多重载。因此,您必须执行Console.WriteLine(date)之类的操作,此时您还可以将Console.WriteLine((object)date)声明为date这个简单示例。

答案 2 :(得分:0)

查看你的函数参数,你要求可以为空的类型。 DateTime(System.DateTime.Now)是一个值类型,默认情况下值类型不可为空。