Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: BooleanConverter не может конвертировать System.Boolean  (Прочитано 9181 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« : 05-04-2011 07:32 » 

VS 2010 .NET 3.5

Что неправильно?

Код: (C#)
                private T GetKeyValue<T>(string key, T defaultValue)
                {
                        object value = defaultValue;
                        var subKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\MySoft\Test1\");
                        if (subKey != null)
                        {
                                value = subKey.GetValue(key);
                                subKey.Close();
                        }
                        var converter = TypeDescriptor.GetConverter(typeof(T));
                        return (T)converter.ConvertFrom(value);
                }

Если ключ в реестре существует, то всё работает замечательно, для типов string и bool. А вот если subKey = NULL, то string работает, а вот с bool проблемы:

Код: (C#)
                        GetKeyValue<bool>("Val1", false);

выбрасывает исключение при конвертировании (используется defaultValue):
                
Код: (C#)
                         converter.ConvertFrom(value);

Тест для Т = bool:

Код: (C#)
                         var buf = converter.CanConvertFrom(typeof(T));

тоже не проходит.
« Последнее редактирование: 05-04-2011 07:34 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 05-04-2011 08:14 » 

Джон, в 2008 под 3.5 (если выбросить всё, относящееся к реестру) это работает.

А ты отладчиком построчно ходил? Может subkey не такой null, какой ты ожидаешь, и value устанавливается в какой-то особый null. (Есть же DBNull и т.п. вещи).

P.S. И вообще, зачем увлекаться var? Улыбаюсь

Добавлено через 10 минут и 15 секунд:
Ошибка - плохо собрал.

И правда не работает. Только там же написано NotSupportedException. Ну не поддерживается, так не поддерживается.
« Последнее редактирование: 05-04-2011 08:24 от dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #2 : 05-04-2011 08:44 » 

Дим, да что в лоб, что по лбу. Хоть с var, хоть с типами. Один х не работает. Я уже даже дефолтный параметр передаю как объект:

Код: (C#)
                private T GetKeyValue<T>(string key, object defaultValue)
                {
                        RegistryKey subKey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\MySoft\Test1\");
                        if (subKey != null)
                        {
                                defaultValue = subKey.GetValue(key);
                                subKey.Close();
                        }
                        TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
                        return (T)converter.ConvertFrom(defaultValue);
                }

Пересобрал с .NET 4, такая же фигня.
« Последнее редактирование: 05-04-2011 08:50 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 05-04-2011 08:51 » 

Джон, ну так и храни в текстовом виде. Делов то Улыбаюсь Или это не твои записи ?
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 05-04-2011 09:03 » 

Лёш, вывернуться-то можно. В реестре хранится в строковом виде. И GetValue возвращает строку. Что ж мне теперь в проге, тоже строковые константы использовать? Это как-то неспортивно.

Если это не поддерживается, то почему в MSDN про это ничего не сказано (я не нашёл).

Да и что за бред вобще-то: BooleanConverter не может конвертировать System.Boolean. Пока ещё надеюсь на кривые ручонки.

Кстати null он тоже не может конвертировать, ну это я ещё могу как-то понять. Хоть и с трудом. Но свой родной false?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 05-04-2011 09:05 » 

Джон, усё спортивно Улыбаюсь Но не константы, а строки.

А попробуй не как bool загружать, а как char или unsigned char
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-04-2011 09:44 » 

Цитата: Джон
Да и что за бред вобще-то: BooleanConverter не может конвертировать System.Boolean. Пока ещё надеюсь на кривые ручонки.
А зачем вообще вот это всё писать с использованием каких-то хитрых конверторов? Насколько я понимаю, они предназначены больше для чего-то сложного, типа самописных классов, или (как в MSDN в примере) конвертирования строки в объект.

Написал бы по-простому:
Код: (C#)
 return (T)Convert.ChangeType(value, typeof(T));

А то и:
Код: (C#)
 return (T)value;

делов-то Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 05-04-2011 21:12 » new

BooleanConverter - это бездарно. Но он существует. И с этим приходится считаться.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines