我是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
忽略了返回类型声明。
我应该避免将var
与dynamic
一起使用吗?
答案 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)是一个值类型,默认情况下值类型不可为空。