2012-01-27 34 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