Casting string to generic type that is a string

11,513

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, but U can be anything! The compiler assumes that most of the time U is not going to be constructed with bool, 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();
Share:
11,513
kleinpa
Author by

kleinpa

Updated on June 23, 2022

Comments

  • kleinpa
    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 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.