Мне все еще интересно знать, существует ли более легкий путь. (Должен, конечно, быть более легкий путь). То, что я закончил тем, что делал, было на ПК 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
. Я просто не понял, что были файлы с пробелами.)
Эрик Липперт подробно писал об этом в блоге. Я согласен, что сначала это неинтуитивно, но он хорошо объясняет это: Представление и идентичность
Вам необходимо преобразовать его к двойному первому, поскольку строка [знаменатель]
представляет собой двойную рамку как объект
т.е.
decimal d = (decimal)((double)row[denominator]);
Я бы попробовал
decimal d = Convert.ToDecimal(row[denominator]);
или
decimal d = 0;
if (!decimal.TryParse(row[denominator], out d))
//do something
Вы можете использовать:
double d1 = (double)row[denominator];
decimal d = (decimal) d1;
Или, конечно, сократите это до:
decimal d = (decimal) (double)(row[denominator]);
Поскольку есть этап распаковки, вам нужно 2 этапа.
Предложение: попробуйте использовать Convert.ToDecimal () вместо прямого преобразования.
Сначала попробуйте преобразовать его в double
. Строка [знаменатель]
заключена в рамку, поэтому прямое преобразование в десятичное
не сработает.
Судя по сообщению об ошибке и описанию, я предполагаю, что строка [знаменатель] представляет собой двойную рамку, то есть типа объект. Распаковка может быть выполнена только для правильного базового типа данных, поскольку среда выполнения теперь не может найти фактический оператор преобразования из двойного в десятичный (в вашем случае он пытается найти оператор, который преобразует объект в десятичный, но этот оператор распаковки и базовый тип не является десятичным. Поэтому правильным способом должно быть преобразование сначала в двойное, а затем в десятичное:
decimal d = (decimal)(double)row[denominator];