Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, corpse56, Вы писали:
C>>говорит что "Заданное приведение является недопустимым." C>>спасибо
L>А так?
L>
L>int i = (int)(DS.Tables["newrev"].Rows[0]["ID"]);
L>
Здравствуйте, corpse56, Вы писали:
C>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, corpse56, Вы писали:
C>>>говорит что "Заданное приведение является недопустимым." C>>>спасибо
L>>А так?
L>>
L>>int i = (int)(DS.Tables["newrev"].Rows[0]["ID"]);
L>>
C>работает! а в чем было дело?
Оператор приведения типа имеет приоритет над оператором доступа к членам (точки).
Здравствуйте, 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>Пиши багрепорт.
Действительно, что-то меня переглючило (видимо пить надо меньше).
Тогда не ясно почему ругался компилятор на пример автора.
Здравствуйте, hardcase, Вы писали:
H>Действительно, что-то меня переглючило (видимо пить надо меньше). H>Тогда не ясно почему ругался компилятор на пример автора.
Имхо автор что-то не договаривает. По себе знаю, что иногда на форуме можешь написать не совсем тот код, который есть на самом деле.
Здравствуйте, MozgC, Вы писали:
MC>Имхо автор что-то не договаривает. По себе знаю, что иногда на форуме можешь написать не совсем тот код, который есть на самом деле.
так и есть... просто иногда попадалось пустое значение...
прошу всех извинить!
спасибо!
Здравствуйте, 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.
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-методы завести
Здравствуйте, _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;
}
Здравствуйте, 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.
Здравствуйте, Lloyd, Вы писали:
L>А зря. Он уже судя по тексту не должен работать.
а что не так, что-то существенное — под рукой сейчас нет студии — не могу проверить
Здравствуйте, darklight, Вы писали:
L>>А зря. Он уже судя по тексту не должен работать. D>а что не так, что-то существенное — под рукой сейчас нет студии — не могу проверить
Первое, что бросилось в глаза: ToInt — возвращает структуру, в то время как Return принимает только ссыллчный тип.