2012-01-27 9 views
7

Ho un semplice problema di fuso in seguito semp metodo #Eccezione Quando Casting String Oggetto per SqlString

using System; 
using System.Data.SqlTypes; 

... 

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

... 

Quando lanciare direttamente da s (in caso di t1), non ottengo alcun errore, ma in fase di lancio da Ricevo un'eccezione:

Il cast specificato non è valido.

Ho lo stesso problema di conversione da object a tutti i tipi System.Data.SqlTypes

Come posso lanciare un object che ha stringa in esso per SqlString?

risposta

3

per rispondere alla tua domanda

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

se o non è una stringa, t1 sarà nullo.

0

Beh, si potrebbe fare questo: var x = new SqlString("hi mom")

Oppure, come nell'esempio che hai fornito:

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

Un consiglio generale: La tua vita sarà probabilmente molto più facile se si impara a usare Documentazione Intellisense e MSDN prima di pubblicare su StackOverflow. Potresti aver risposto a questa domanda da soli in circa 5 secondi usando la documentazione.

+0

DBM, stai citando di nuovo la mia domanda qui! Quello che sto cercando di dire è lanciato per 'stringa' diretta a' SqlString' Esiste, ma non c'è cast per 'Object' su' SqlString' e quindi la mia domanda è stata come posso lanciare 'Object' su' SqlString' e NOT? 'stringa' in' SqlString'! Si prega di leggere attentamente la domanda prima di rispondere – Bistro

4

Questo perché c'è un implicit conversion operator for String to SqlString.

In altre parole, non si tratta di un cast integrato semplice: i progettisti di SqlString hanno deciso di consentire il cast delle stringhe su SqlString. Non l'hanno fatto per Object, quindi l'errore che stai vedendo.

+0

dasblinkenlight, il tuo non ha risposto alla mia domanda! Non so come la tua risposta ottenga 3 voti immediati! – Bistro

+0

Devo ammettere che hai indicato chiaramente il problema! potrebbe essere un programmatore che dimentica, o la risposta popolare di microsoft "by Design"! – Bistro

+0

@BSarmady Ho pensato che una volta che saprai perché "Cast specificato non è valido", potresti facilmente codificare una soluzione con un'istruzione 'if' o un operatore condizionale. La soluzione di SynXsiS è molto elegante, però: forse non è così facile da capire di una con un condizionale, ma mi piace molto. – dasblinkenlight

3

Nessuna delle altre risposte risolve la domanda di trasmettere il riferimento oggetto a SqlString. Se si è certi che i punti di riferimento di oggetto in una stringa, è semplice:

var ss = (SqlString)(string)o; 

Se o potrebbe contenere un valore diverso da una stringa, si può fare questo, invece:

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

Oppure, se si vuole andare giù per la (pericolosa) percorso di memorizzazione dei dati non-stringa in formato stringa:

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

Phoog, penso che intendevi scrivere 'SqlString ss = (stringa) o;'. Credo che la tua risposta sia la più vicina che posso ottenere. Sfortunatamente il contenuto di 'o' non è sempre una stringa e qualche volta può essere nullo ed è per questo che ho usato SqlString per portare null al metodo che chiama la mia funzione. Nella maggior parte dei casi null non è uguale alla stringa vuota (o 0 nei casi interi). – Bistro

+0

Non intendevo scrivere 'SqlString ss = (string) o;' ma questa affermazione è essenzialmente equivalente a quella che ho scritto. Per quanto ne so, tuttavia, la dichiarazione dovrebbe funzionare bene anche se o è nullo. Se o potrebbe essere un valore non stringa, non null, vedere la risposta (presto a essere modificata) per un'altra soluzione. – phoog

Problemi correlati