Приведение object к int
От: corpse56  
Дата: 16.09.10 13:52
Оценка:
Здравствуйте!
почему вот так работает:
            object obj = DS.Tables["newrev"].Rows[0]["ID"];
            int i = (int)obj;

а так не работает:

            int i = (int)DS.Tables["newrev"].Rows[0]["ID"];


?
говорит что "Заданное приведение является недопустимым."
спасибо
Re: Приведение object к int
От: Lloyd Россия  
Дата: 16.09.10 14:05
Оценка: 2 (1)
Здравствуйте, corpse56, Вы писали:

C>говорит что "Заданное приведение является недопустимым."

C>спасибо

А так?

int i = (int)(DS.Tables["newrev"].Rows[0]["ID"]);
Re[2]: Приведение object к int
От: corpse56  
Дата: 16.09.10 14:13
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, corpse56, Вы писали:


C>>говорит что "Заданное приведение является недопустимым."

C>>спасибо

L>А так?


L>
L>int i = (int)(DS.Tables["newrev"].Rows[0]["ID"]);
L>


работает! а в чем было дело?
Re[3]: Приведение object к int
От: Lloyd Россия  
Дата: 16.09.10 14:14
Оценка: 1 (1) :))) :)
Здравствуйте, corpse56, Вы писали:

L>>А так?


L>>
L>>int i = (int)(DS.Tables["newrev"].Rows[0]["ID"]);
L>>


C>работает!


Подозрительно. А теперь проверь, работает ли тот вариант, который не работал.
Re[3]: Приведение object к int
От: hardcase Пират http://nemerle.org
Дата: 16.09.10 20:09
Оценка: :))
Здравствуйте, corpse56, Вы писали:

C>Здравствуйте, Lloyd, Вы писали:


L>>Здравствуйте, corpse56, Вы писали:


C>>>говорит что "Заданное приведение является недопустимым."

C>>>спасибо

L>>А так?


L>>
L>>int i = (int)(DS.Tables["newrev"].Rows[0]["ID"]);
L>>


C>работает! а в чем было дело?


Оператор приведения типа имеет приоритет над оператором доступа к членам (точки).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Приведение object к int
От: Lloyd Россия  
Дата: 16.09.10 20:27
Оценка: 2 (2) :)
Здравствуйте, hardcase, Вы писали:

C>>работает! а в чем было дело?


H>Оператор приведения типа имеет приоритет над оператором доступа к членам (точки).


Правда что-ли?! Только вот компилятор об этом не знает:
int a = 1;
string s = (long)a.ToString();


Результат:

error CS0030: Cannot convert type 'string' to 'long'


Пиши багрепорт.
Re[5]: Приведение object к int
От: hardcase Пират http://nemerle.org
Дата: 16.09.10 21:06
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, hardcase, Вы писали:


C>>>работает! а в чем было дело?


H>>Оператор приведения типа имеет приоритет над оператором доступа к членам (точки).


L>Правда что-ли?! Только вот компилятор об этом не знает:

L>
L>int a = 1;
L>string s = (long)a.ToString();
L>


L>Результат:

L>

L>error CS0030: Cannot convert type 'string' to 'long'


L>Пиши багрепорт.


Действительно, что-то меня переглючило (видимо пить надо меньше).
Тогда не ясно почему ругался компилятор на пример автора.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: Приведение object к int
От: MozgC США http://nightcoder.livejournal.com
Дата: 16.09.10 21:23
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Действительно, что-то меня переглючило (видимо пить надо меньше).

H>Тогда не ясно почему ругался компилятор на пример автора.

Имхо автор что-то не договаривает. По себе знаю, что иногда на форуме можешь написать не совсем тот код, который есть на самом деле.
Re[7]: Приведение object к int
От: corpse56  
Дата: 20.09.10 08:54
Оценка: :))
Здравствуйте, MozgC, Вы писали:

MC>Имхо автор что-то не договаривает. По себе знаю, что иногда на форуме можешь написать не совсем тот код, который есть на самом деле.


так и есть... просто иногда попадалось пустое значение...
прошу всех извинить!
спасибо!
Re: Приведение object к int
От: _FRED_ Черногория
Дата: 20.09.10 09:09
Оценка:
Здравствуйте, corpse56, Вы писали:

C>почему вот так работает:

C>            object obj = DS.Tables["newrev"].Rows[0]["ID"];
C>            int i = (int)obj;

C>а так не работает:
C>            int i = (int)DS.Tables["newrev"].Rows[0]["ID"];

C>?
C>говорит что "Заданное приведение является недопустимым."

На будущее: надо указать, _кто_ говорит, а то большинству ответившись показалось, что "говорит" компилятор.
Второе: текст исключения нужно показывать полностью, не данные из поля Message, а результат вызова ToString() объекта исключения или полную строку ошибки, выдаваемую компилятором (из окна Output) — тогда и ясно будет, что у вас происходит: исключение или ошибка компиляции.
Help will always be given at Hogwarts to those who ask for it.
Re[8]: Приведение object к int
От: darklight  
Дата: 20.09.10 09:14
Оценка:
Здравствуйте, corpse56, Вы писали:
Для такого разбора хорошо подходит использование fluent-интерфейса для доступа к данным и их преобразования:

//int i = (int)DS.Tables["newrev"].Rows[0]["ID"];
int i = this.With(x => DS) 
.With(x => x.InvokedExpression) 
.With(x => x.Tables["newrev"]) 
.With(x => x.Rows[0]) 
.With(x => x["ID"]) 
.With(x => Converter.ToInt(x)) 
.Return(x => x, 0)


где
public static TResult With<TInput, TResult>(this TInput o, Func<TInput, TResult> action)  where TInput : class
{   
if (o == null) return null
return action(o); 
}

public static TResult Return<TInput,TResult>(this TInput o, Func<TInput, TResult> action, TResult failureValue) where TInput: class
{ 
if (o == null) return failureValue; 
return action(o); 
}


ну как-то так
В принципе, для доступа к индексаторам таблиц и строк, а так же для приведения типов — можно отдельные fluent-методы завести
Re[9]: Приведение object к int
От: Lloyd Россия  
Дата: 20.09.10 09:18
Оценка:
Здравствуйте, darklight, Вы писали:

D>ну как-то так


Ты уверен, что это работает?
Re[9]: Приведение object к int
От: _FRED_ Черногория
Дата: 20.09.10 09:20
Оценка:
Здравствуйте, darklight, Вы писали:

D>Для такого разбора хорошо подходит использование fluent-интерфейса для доступа к данным и их преобразования:


ИМХО, спорно.

D>где

D>public static TResult With<TInput, TResult>(this TInput o, Func<TInput, TResult> action)  where TInput : class
D>{   
D>if (o == null) return null
D>return action(o); 
D>}

D>public static TResult Return<TInput,TResult>(this TInput o, Func<TInput, TResult> action, TResult failureValue) where TInput: class
D>{ 
D>if (o == null) return failureValue; 
D>return action(o); 
D>}


D>ну как-то так

D>В принципе, для доступа к индексаторам таблиц и строк, а так же для приведения типов — можно отдельные fluent-методы завести

Вот только у топистартера проблема не с null, скорее всего, а с DBNull и тут придумывать ничего не нужно.
Help will always be given at Hogwarts to those who ask for it.
Re[10]: Приведение object к int
От: darklight  
Дата: 20.09.10 09:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Ты уверен, что это работает?

Я не проверял — я просто намекнул на иной подход, с которым сам недавно познакомился
Re[11]: Приведение object к int
От: Lloyd Россия  
Дата: 20.09.10 09:44
Оценка:
Здравствуйте, darklight, Вы писали:

L>>Ты уверен, что это работает?

D>Я не проверял —

А зря. Он уже судя по тексту не должен работать.
Re[10]: Приведение object к int
От: darklight  
Дата: 20.09.10 09:50
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Вот только у топистартера проблема не с null, скорее всего, а с DBNull и тут придумывать ничего не нужно.

ну это же не принципиально — заменим null на DBNULL (а, точнее добавим DBNull в условие сравнения с null)
Здесь более важен сам подход многочленного доступа к вложенным полям и преобразования к int только в случае успеха всей цепочки (отсутствия null или DBNull на любом ссылочном члене), а иначе — возврат какого-то иного значения — default value (например для int: 0 или -1) или генерация более осмысленного пользовательского исключения на последнем этапе.

Ещё можно вот такую функцию добавить:
public static TInput Unless<TInput>(this TInput o, Func<TInput, bool> action) where TInput : class
{ 
if ((o == null)||(o == DBNull))
  return null; 

return action(o) ? null : o; 
}
Re[11]: Приведение object к int
От: _FRED_ Черногория
Дата: 20.09.10 10:02
Оценка:
Здравствуйте, darklight, Вы писали:

_FR>>Вот только у топистартера проблема не с null, скорее всего, а с DBNull и тут придумывать ничего не нужно.

D>ну это же не принципиально — заменим null на DBNULL (а, точнее добавим DBNull в условие сравнения с null)

Ещё как принципиально. Например, это ограничевает область применения подхода с тотальной (как в вашем примере) до простейшей (проверять нужно перед самой последней операцией — приведением типа).

D>Здесь более важен сам подход многочленного доступа к вложенным полям и преобразования к int только в случае успеха всей цепочки (отсутствия null или DBNull на любом ссылочном члене), а иначе — возврат какого-то иного значения — default value (например для int: 0 или -1) или генерация более осмысленного пользовательского исключения на последнем этапе.


В данном случае такой подход совершенно бессмысленен. Если не верите, напишите компилируемый пример ваших хелперов и покажите, как должен выглядеть код топикстартера с использованием предлагаемого вами подхода.

D>Ещё можно вот такую функцию добавить:

D>public static TInput Unless<TInput>(this TInput o, Func<TInput, bool> action) where TInput : class
D>{ 
D>if ((o == null)||(o == DBNull))
D>  return null; 

D>return action(o) ? null : o; 
D>}


Не нужно ничего добавлять, тем более того, что не компилируется
Help will always be given at Hogwarts to those who ask for it.
Re[12]: Приведение object к int
От: darklight  
Дата: 20.09.10 11:02
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>А зря. Он уже судя по тексту не должен работать.

а что не так, что-то существенное — под рукой сейчас нет студии — не могу проверить
Re[13]: Приведение object к int
От: Lloyd Россия  
Дата: 20.09.10 11:21
Оценка:
Здравствуйте, darklight, Вы писали:

L>>А зря. Он уже судя по тексту не должен работать.

D>а что не так, что-то существенное — под рукой сейчас нет студии — не могу проверить

Первое, что бросилось в глаза: ToInt — возвращает структуру, в то время как Return принимает только ссыллчный тип.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.