Casting string to generic type that is a string
Solution 1
You basically need to go via object
when casting to a generic type:
return (T)(object) v.ToString()
and
return (T)(object) v;
I would use is
rather than catching an InvalidCastException
though.
See Eric Lippert's recent blog post for more details of why this is necessary.
In particular:
Because the compiler knows that the only way this conversion could possibly succeed is if
U
is bool, butU
can be anything! The compiler assumes that most of the timeU
is not going to be constructed withbool
, and therefore this code is almost certainly an error, and the compiler is bringing that fact to your attention.
(Substitute T
for U
and string
for bool
...)
Solution 2
You need to cast your string as object
as your return type is generic i.e.
return (T)(object)v.ToString();
kleinpa
Updated on June 23, 2022Comments
-
kleinpa almost 2 years
I'm writing a method to do a intelligent type conversion - using ToString() if the type parameter happens to be a string, otherwise casting but returning null if the cast doesn't work. Basically gets as much information out of
v
it can without throwing an exception.I check that
T
is indeed astring
before I attempt the cast, but the compiler is still not a fan:Cannot convert type 'string' to 'T'
And here's my method:
public T? Convert<T>(object v) { if (typeof(T) == typeof(string)) { return (T)v.ToString(); // Cannot convert type 'string' to 'T' } else try { return (T)v; } catch (InvalidCastException) { return null; } }
Also let me know if this is some sort of unforgivable sin. I'm using it to deal with some data structures that could have mixed types.