我有一个来自数据库的日期,如下图所示。
然而,当我将此值转换为DateTime
- 实例时,我得到如下所示的错误。
然而,在运行代码时,我得到一个InvalidCastException
,返回的值无法转换为DateTime
。
我在.Net3.5上使用VS2010就是为什么我想知道为什么需要这个库。
在引用的程序集中我使用IronPython,据我所知使用DLR。在.Net 3.5上,我也可以使用它来引用Microsoft.Scripting和Microsoft.Scripting.Core。我想这会以任何方式导致错误。奇怪的是,在执行产生该异常的代码时,根本不会调用使用IronPython的代码。
编辑:对于那些不相信的人:相同的代码有时会查询数据库中的某些行并返回正确的日期。但是,有一次它会引发异常。
进一步编辑:正如您在第一张图片上看到的那样row.GetValue
会返回一个dynamic
,这很奇怪,因为实现此代码的程序集(ArcGIS 10.2 for Desktop)也是使用.Net 3.5编写的。此外,当我转到该类型的定义时,我得object get_Value(int Index);
而不是dynamic
。
答案 0 :(得分:1)
至少需要 .NET framework 4.0 才能使用dynamic
。编译器允许您定义和分配dynamic
变量,但是当您尝试对dynamic
变量执行任何操作时,您将遇到此错误
Predefined type 'Microsoft.CSharp.RuntimeBinder.Binder' is not defined or imported
请参阅C# 4.0 and .Net 3.5 更多细节。归功于Aaronaught(回答这个问题)
更新:
<。>在.Net 3.5上我可以使用它但是在引用Microsoft.Scripting和Microsoft.Scripting.Core时也是如此。我想这会以任何方式导致错误。
IronPython有自己定制的Microsoft.Scripting和Microsoft.Scripting.Core。当你再次引用这两个组件时,它将掩盖IronPythons&#39; dll并使用那些我相信导致那些奇怪行为的官方。尝试删除两个引用,看看有帮助吗
答案 1 :(得分:0)
我发现了一些非常奇怪的行为,这解释了异常。
首先,InvalidCastException
完全正确,因为对row.Get_Value(2)
的调用实际上已返回DBNull
,当然无法将其转换为DateTime
。
接下来,QuickWatch中显示的值不正确,因为VS向我显示了该异常的错误行,使我假设调用(DateTime) row.Get_Value(2)
导致错误调用row.Get_Value(1)
(前者是前者)。然而,后者返回DBNull
已经提到过。
最后但并非最不重要的是,丢失的库周围的杂乱的东西显然是由ArcGIS本身引起的。由于@pengMiao已经假设此调用实际上返回dynamic
(尽管其签名仅提及object
)。现在,QuickWatch不够智能,无法将其直接转换为正确的类型(在我的情况下为DateTime
)。但是,如果我先写(DateTime)(object) row.Get_Value(2)
首先向object
提供演员,然后再向DateTime
提供演员,我们会在QuickWatch和可执行文件中获得我们想要的内容。
我仍然不清楚为什么在QuickWatch中我们得到dynamic { DateTime }
作为返回值的数据类型,但它现在可以正常工作。