2012-07-24 38 views
1

我今天正在使用一些遗留代码,并注意到一些奇怪的东西。我们有一些旧的ADO .NET代码,它将数据库中的一些数据读入DataTable.NET 3.5+在DataRow.Item属性上使用类型推断吗?

在某个时间点,下面的代码

SubscriptionDT.Rows[0]["LastShownBenefits"].ToString().Substring(0, 10) 

返回

2001-01-01 

不过,现在它返回

1/1/2001 1 

如果我快速监视SubscriptionDT.Rows[0]["LastShownBenefits"]它似乎能推断该类型为System.DateTime。 (该列在数据库中是DateTime)。不过,我有一种感觉,在我们将项目升级到.NET 3.5之前,这可能被认为是System.Object。显然,调用.ToString()返回不同的结果,两者之间...

我的问题是:

1)我说得对类型推断?我认为这可能是因为在.NET 3.5中引入了var关键字。

2)是否有这种变化(或类似的变化)提供的任何文档?我一直在搜索MSDN一段时间,但一直未能找到任何东西。

+0

这是什么列定义为您的XSD? – GrayFox374 2012-07-24 14:04:22

回答

2

不,你是不对的。原因是现在不管什么原因都使用不同的语言环境。
这就是为什么你应该总是在ToString的调用中指定文化,以避免这种类型的问题。

需要明确的是:这有绝对无关,与类型推断。该对象是.NET 2.0中的盒装DateTime,它仍然是.NET 3.5中的盒装DateTime

var关键字是严格意义上的编译时间功能。有使用var关键字和代码明确指定了变量的类型代码之间的产生IL没什么区别,例如:

var date = DateTime.Now; 
// results in exactly the same IL code as: 
DateTime date = DateTime.Now; 
+0

感谢您的回答。有关* how *语言环境的任何想法现在可能会有所不同?该代码从未在'.ToString'调用中指定过一个;是否有可能因其他因素而随时间变化? – 2012-07-24 14:08:55

+0

@JeremyWiggins:是的,那是可能的。正如“DateTime.ToString”的文档所述,它使用当前文化来格式化字符串表示。当前的文化可以通过应用程序中的任何代码来设置。如您所见,当您将[.NET 2.0版本](http://msdn.microsoft.com/zh-cn/library/k494fzbf(v = vs80).aspx)与[.NET 3.5版本](http://msdn.microsoft.com/en-us/library/k494fzbf(v = vs.90).aspx),你会发现它仍然使用“G”格式说明符和CurrentCulture,所以没有发生突变这里也是。 – 2012-07-24 14:13:12

+0

我怀疑你的应用程序中的某个地方正在设置CurrentCulture。 – 2012-07-24 14:14:07