2012-01-27 21 views
7

Tengo un problema con un reparto simple en la siguiente sencilla C# métodoExcepción Cuando se lanza Cadena de objetos para SqlString

using System; 
using System.Data.SqlTypes; 

... 

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

... 

Cuando se lanza directamente desde s (en caso de t1), no consigo ningún error, pero cuando se lanza de o obtengo la excepción:

El lanzamiento especificado no es válido.

he mismo problema conversión de object a todo tipo System.Data.SqlTypes

¿Cómo puedo emitir un object que tiene la cadena en ella a SqlString?

Respuesta

3

para responder a su pregunta

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

si o no es una cadena, t1 será nulo.

0

Bueno, se podría hacer esto: var x = new SqlString("hi mom")

O, como en el ejemplo que nos ha facilitado:

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

Una palabra de consejos generales: Tu vida será probablemente mucho más fácil si aprende a usar Documentación de Intellisense y MSDN antes de publicar en StackOverflow. Podrías haber respondido esta pregunta tú mismo en aproximadamente 5 segundos usando la documentación.

+0

DBM, ¡usted está citando mi pregunta nuevamente aquí! Lo que estoy tratando de decir es que está lanzado para 'string' directo a' SqlString' Existe pero no hay conversión para 'Object' en' SqlString' y luego mi pregunta fue ¿cómo puedo convertir 'Object' en' SqlString' y NO 'cadena' a' SqlString'! Por favor, lea la pregunta cuidadosamente antes de contestar – Bistro

4

Esto es porque hay un implicit conversion operator for String to SqlString.

En otras palabras, no se trata de un elenco integrado simple: los diseñadores de SqlString decidieron permitirle enviar cadenas a SqlString. No lo hicieron por Objeto, de ahí el error que estás viendo.

+0

dasblinkenlight, ¡no respondió mi pregunta! ¡No sé cómo tu respuesta obtiene 3 votos instantáneos! – Bistro

+0

Debo admitir que apuntó el problema con claridad. ¡Puede ser que sea un programador que olvida, o una respuesta popular de Microsoft "por Diseño"! – Bistro

+0

@BSarmady Pensé que una vez que supiera por qué "El reparto especificado no es válido", podría codificar fácilmente una solución con una instrucción 'if' o un operador condicional. Sin embargo, la solución de SynXsiS es muy elegante: tal vez no tan fácil de entender como una condicional, pero me gusta mucho. – dasblinkenlight

3

Ninguna de las otras respuestas aborda la cuestión de convertir la referencia del objeto al SqlString. Si está seguro de que los puntos de referencia de objeto a una cadena, es simple:

var ss = (SqlString)(string)o; 

si o puede contener un valor que no sea una cadena, se puede hacer esto, en su lugar:

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

O, si quieres ir por el (peligroso) ruta de almacenar datos que no son cadenas en formato de cadena:

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

Phoog, creo que quisiste escribir 'SqlString ss = (string) o;'. Creo que tu respuesta es la más cercana que puedo obtener. Lamentablemente, el contenido de 'o' no siempre es una cadena y, a veces puede ser nulo, y es por eso que utilicé SqlString para llevar nulo al método que llama a mi función. En la mayoría de los casos, null no es igual a una cadena vacía (o 0 en casos enteros). – Bistro

+0

No quise escribir 'SqlString ss = (string) o;' pero esa declaración es esencialmente equivalente a la que escribí. Hasta donde yo sé, sin embargo, la declaración debería funcionar bien incluso si o es nulo. Si o puede ser un valor que no sea de cadena ni nulo, consulte la respuesta editada (próximamente) para otra solución. – phoog

Cuestiones relacionadas