问题
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.
回答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
...)
回答2:
You need to cast your string as object
as your return type is generic i.e.
return (T)(object)v.ToString();
回答3:
Try to convert to object
before converting to T
return (T)(object)v;
回答4:
using System.ComponentModel;
...
public T Convert<T>(object v) {
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}
Warning, this will throw an exception if no conversion exists between T and the object contained in v.
来源:https://stackoverflow.com/questions/11866229/casting-string-to-generic-type-that-is-a-string