Исключение при приведении объекта 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 секунд, используя документацию.