Почему я получаю InvalidCastException при кастинге вдвое большего по сравнению с десятичным числом

Мне все еще интересно знать, существует ли более легкий путь. (Должен, конечно, быть более легкий путь). То, что я закончил тем, что делал, было на ПК Linux с помощью удара:

# Get woking copy we're going to change
cd ~/work
rm -rf modulename
cvs up -dP modulename
cd modulename

# Remove all files
find . -name CVS -prune -o -type f -print | xargs cvs rm -f

# Get the old revision
cd ~
mkdir scratch
cd scratch
cvs -q co -D 2008-12-31 modulename
cd modulename

# Copy everything to the working dir and do "cvs add" on it
find . -name CVS -prune -o -type f -print | \
    xargs tar c | \
    (cd ~/work/modulename && tar xv | \
    xargs cvs add)

# Check everything is OK before we commit
cd ~/work/modulename
cvs -nq up

# it gave me an error on readme.txt because I'd deleted and then added it, so:
mv readme.txt x # save good rev
cvs add readme.txt # resurrect the bad rev
mv x readme.txt # clobber file with good rev

# Commit it
cvs commit -m "Revert all changes this year"

# Delete now-empty directories
cvs -q up -dP

# Double-check everything is back how it was
diff -ur -xCVS ~/scratch/modulename ~/work/modulename

Тогда я обнаружил, что были все еще различия - мой коллега добавил имена файлов, содержащие пробелы, которые не были удалены вышеупомянутым процессом. Я должен был удалить тех отдельно. (Я должен был использовать find ... -print0, а не -print и передать -0 аргумент xargs. Я просто не понял, что были файлы с пробелами.)

7
задан Anonym 3 November 2009 в 12:54
поделиться

7 ответов

Эрик Липперт подробно писал об этом в блоге. Я согласен, что сначала это неинтуитивно, но он хорошо объясняет это: Представление и идентичность

10
ответ дан 6 December 2019 в 06:03
поделиться

Вам необходимо преобразовать его к двойному первому, поскольку строка [знаменатель] представляет собой двойную рамку как объект т.е.

decimal d = (decimal)((double)row[denominator]);
6
ответ дан 6 December 2019 в 06:03
поделиться

Я бы попробовал

decimal d = Convert.ToDecimal(row[denominator]);

или

decimal d = 0;
if (!decimal.TryParse(row[denominator], out d))
    //do something
4
ответ дан 6 December 2019 в 06:03
поделиться

Вы можете использовать:

double d1 = (double)row[denominator];
decimal d = (decimal) d1;

Или, конечно, сократите это до:

decimal d = (decimal) (double)(row[denominator]);

Поскольку есть этап распаковки, вам нужно 2 этапа.

3
ответ дан 6 December 2019 в 06:03
поделиться

Предложение: попробуйте использовать Convert.ToDecimal () вместо прямого преобразования.

3
ответ дан 6 December 2019 в 06:03
поделиться

Сначала попробуйте преобразовать его в double . Строка [знаменатель] заключена в рамку, поэтому прямое преобразование в десятичное не сработает.

2
ответ дан 6 December 2019 в 06:03
поделиться

Судя по сообщению об ошибке и описанию, я предполагаю, что строка [знаменатель] представляет собой двойную рамку, то есть типа объект. Распаковка может быть выполнена только для правильного базового типа данных, поскольку среда выполнения теперь не может найти фактический оператор преобразования из двойного в десятичный (в вашем случае он пытается найти оператор, который преобразует объект в десятичный, но этот оператор распаковки и базовый тип не является десятичным. Поэтому правильным способом должно быть преобразование сначала в двойное, а затем в десятичное:

decimal d = (decimal)(double)row[denominator];
2
ответ дан 6 December 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: