У меня есть такой метод:
public static T To
Если я на месте T стоит double (или float), то выдается InvalidCastException с текстом вроде System.InvalidCastException: Недопустимое приведение "Char" к "Double".
Ну что не так с double? Тип явно больше char. Сейчас этот метод выглядит так:
public static T To
Сам вопрос - в заголовке. Это как-то объясняется где-нибудь с точки зрения логики? Я ответа не нашел.
Ответ
Метод Convert.ChangeType внутри себя пытается привести аргумент к IConvertible и вызвать соответствующий метод.
Для случая с Char, будет вызываться его метод .ToDouble
///
В котором явно бросается исключение.
Почему метод .ToDouble не поддерживается?
Не только этот метод. .ToBoolean, .ToDateTime, .ToDecimal и .ToSingle тоже не поддерживаются, все они бросают InvalidCastException так же как и .ToDouble
В этом случае дизайн .NET пытается уберечь вас от проблем. Преобразование char в целые типы имеет смысл, вы можете посмотреть на таблицы Unicode и посчитать количество codepoint. Но что должно означать преобразование в Boolean? Какой из Unicode code point будет True? Как символ вообще может быть дробным значением? Нет половинных или четвертных codepoint
перевод ответа @HansPassant
Стоит так же отметить, что тип char может быть неявно преобразован в тип ushort, int, uint, long, ulong, float, double или decimal
То есть следующий код отработает без ошибок:
char c = 'c';
double a = (double)c;
double b = c;
Комментариев нет:
Отправить комментарий