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 a string
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.
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
...)
You need to cast your string as object
as your return type is generic i.e.
return (T)(object)v.ToString();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With