Вам нужно перейти через object
при кастеризации к родовому типу:
return (T)(object) v.ToString()
и
return (T)(object) v;
Я бы использовал is
, а не ловил InvalidCastException
.
Подробнее о том, почему это необходимо, см. в недавнем блоге Эрика Липперта .
В частности:
Поскольку компилятор знает, что единственный способ, которым это преобразование может быть успешным, - это
blockquote >U
- bool, ноU
может быть чем угодно! Компилятор предполагает, что большую часть времениU
не будет создан сbool
, и поэтому этот код почти наверняка является ошибкой, и компилятор доводит этот факт до вашего сведения.(Подставить
T
дляU
иstring
дляbool
...)