Исключение при приведении объекта String к SqlString

У меня есть простая проблема приведения в следующем простом методе C#

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

Как я могу разыграть object в котором есть строка SqlString?

4 ответа

Решение

Ответить на ваш вопрос

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

если o не строка, t1 будет нулевым.

Это потому, что существует неявный оператор преобразования для String в SqlString.

Другими словами, вы не имеете дело с простым встроенным приведением: разработчики SqlString решили разрешить вам приводить строки в SqlString. Они не сделали этого для Объекта, отсюда и ошибка, которую вы видите.

Ни один из других ответов не рассматривает вопрос о приведении ссылки на объект к SqlString. Если вы уверены, что ссылка на объект указывает на строку, это просто:

var ss = (SqlString)(string)o;

Если o может содержать значение, отличное от строки, вы можете сделать это:

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

Или, если вы хотите пойти по (опасному) пути хранения нестроковых данных в строковом формате:

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

Ну, вы могли бы сделать это: var x = new SqlString("hi mom")

Или, как в приведенном вами примере:

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

Слово общего совета: Ваша жизнь, вероятно, будет намного проще, если вы научитесь использовать документацию Intellisense и MSDN до публикации в Stackru. Вы могли бы самостоятельно ответить на этот вопрос в течение 5 секунд, используя документацию.

Другие вопросы по тегам