2012-01-27 38 views
7

我在下面簡單的C#方法簡單鑄的問題異常,當鑄造String對象到的SqlString

using System; 
using System.Data.SqlTypes; 

... 

private void method1() { 
    string s = "TestString"; 
    object o = s; 
    SqlString t1 = (SqlString) s; 
    SqlString t2 = (SqlString) o; 
} 

... 

當從s(在T1的情況下)直接鑄造,鑄造時,我沒有得到任何錯誤,但從o我收到異常:

指定的轉換無效。

我有同樣的問題,從object轉換成所有類型System.Data.SqlTypes

我怎麼能投已在其字符串SqlStringobject

回答

3

要回答你的問題

private void method1() { 
    object o = "MyString"; 
    SqlString t1 = o as String   
} 

如果o不是字符串,t1將爲空。

0

嗯,你可以這樣做:var x = new SqlString("hi mom")

或者,如示例您提供:

string s = "TestString"; 
object o = s; 
SqlString t1 = new SqlString((string)o); 

一般一句忠告:如果您瞭解如何使用你的生活可能會容易得多Intellisense和MSDN文檔發佈到StackOverflow之前。通過使用文檔,您可以在5秒內自行回答此問題。

+0

DBM,你在這裏再次引用我的問題!我想說的是直接將'string'轉換爲'SqlString'存在,但沒有將'Object'轉換爲'SqlString',然後我的問題是如何將Object轉換爲'SqlString'而不是把'string'改成'SqlString'!在回答之前請仔細閱讀問題 – Bistro 2012-01-27 04:26:28

4

這是因爲有一個implicit conversion operator for String to SqlString

換句話說,你並沒有處理簡單的內置轉換:SqlString的設計者決定允許你將字符串轉換爲SqlString。他們沒有爲Object做它,因此你看到的錯誤。

+0

dasblinkenlight,你沒有回答我的問題!我不知道你的答案如何獲得3張即時投票! – Bistro 2012-01-27 04:22:43

+0

我應該承認你清楚地指出了問題!可能它是一個忘記程序員,或微軟的「通過設計」的流行答案! – Bistro 2012-01-27 05:59:34

+0

@BSarmady我認爲,一旦你知道爲什麼「指定的轉換無效」,你就可以用if語句或條件運算符輕鬆地編寫解決方案。然而,SynXsiS的解決方案非常優雅:或許不如有條件的解說容易,但我非常喜歡它。 – dasblinkenlight 2012-01-27 10:25:38

3

其他答案都沒有解決將對象引用強制轉換爲SqlString的問題。如果你確信對象引用指向一個字符串,它很簡單:

var ss = (SqlString)(string)o; 

如果O可能會持有多字符串的值,你可以這樣做,而不是:

var ss = (SqlString)(o as string); 

或者,如果你想下去字符串格式存儲非字符串數據的(危險的)路徑:

var ss = o == null ? (SqlString)null : o.ToString(); 
+0

Phoog,我想你的意思是寫'SqlString ss =(string)o;'。我相信你的答案與我所能得到的最接近。不幸的是,'o'的內容並不總是字符串,有時可能爲空,這就是爲什麼我使用SqlString來將null傳遞給調用我的函數的方法。在大多數情況下,null不等於空字符串(在整數情況下爲0)。 – Bistro 2012-01-27 05:57:54

+0

我不是故意寫'SqlString ss =(string)o;'但是這個語句基本上和我寫的一樣。據我所知,然而,即使o爲空,該聲明也可以正常工作。如果o可能是某個非字符串,非空值,請參閱另一解決方案的(即將編輯的)答案。 – phoog 2012-01-27 17:49:59