2012-07-24 27 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