2010-06-11 20 views
1

當創建一個SqlParameter(.NET3.5)或OdbcParameter時,我經常使用SqlParameter(string parameterName, Object value)構造函數重載來設置一個語句中的值。SqlParameter構造函數編譯器超載選擇

但是,當我嘗試傳遞一個0作爲值參數時,我最初被C#編譯器選中(string, OdbcType)過載而不是(string, Object)

MSDN實際上在remarks section中對此遺漏提出了警告,但解釋讓我感到困惑。

爲什麼C#編譯器決定應將文字0參數轉換爲OdbcType而不是Object?該警告還表示使用Convert.ToInt32(0)來強制使用Object過載。

它令人困惑地說,這將0轉換爲「對象類型」。但不是0已經是「對象類型」?該頁面的Types of Literal Values部分似乎認爲文字總是鍵入的,因此從System.Object繼承。

這種行爲似乎並不直觀。這可能與反方差或共方差有關嗎?

回答

2

按照C# Language Specification 4.0

字面0隱式轉換爲 任何枚舉類型。


所以SqlParameter("parameterName", 0)解析爲SqlParameter(string, OdbcType)超載。

如果更改爲SqlParameter("parameterName", 1)它將解析爲SqlParameter(string, object)過載。相同的邏輯適用於Convert.ToInt32

+0

謝謝,非常清楚的解釋。 – Ash 2010-06-15 01:06:54

1

0是任何枚舉的默認值。因此它比對象更精確的匹配。

+1

因此,如果類型檢查不夠,編譯器將使用參數值來匹配重載?我認爲參數的類型或其基本類型是唯一使用的信息。我知道枚舉的默認類型是一個整數,但沒有意識到這一點。 – Ash 2010-06-11 05:02:45

相關問題