El valor del tipo ‘T’ no se puede convertir a

Esta es probablemente una pregunta de novato, pero sorprendentemente, Google no proporcionó una respuesta.

Tengo este método bastante artificial

T HowToCast(T t) { if (typeof(T) == typeof(string)) { T newT1 = "some text"; T newT2 = (string)t; } return t; } 

Viniendo de un fondo de C ++, he esperado que esto funcione. Sin embargo, no comstack con “No se puede convertir implícitamente el tipo ‘T’ a la cadena” y “No se puede convertir el tipo ‘T’ a la cadena” para las dos asignaciones anteriores.

Estoy haciendo algo conceptualmente mal o simplemente tengo una syntax incorrecta. Por favor, ayúdame a resolverlo.

¡Gracias!

Aunque está dentro de un bloque if , el comstackdor no sabe que T es una string .
Por lo tanto, no te deja lanzar. (Por la misma razón que no puedes convertir DateTime en una string )

Necesita convertir a object , (a lo que cualquier T puede convertir), y de allí a string (ya que el object se puede convertir a una string ).
Por ejemplo:

 T newT1 = (T)(object)"some text"; string newT2 = (string)(object)t; 

Ambas líneas tienen el mismo problema

 T newT1 = "some text"; T newT2 = (string)t; 

El comstackdor no sabe que T es una cadena y, por lo tanto, no tiene forma de saber cómo asignar eso. Pero desde que marcó puede simplemente forzarlo con

 T newT1 = "some text" as T; T newT2 = t; 

no necesita lanzar el t ya que ya es una cadena, también necesita agregar la restricción

 where T : class 

Si está buscando tipos explícitos, ¿por qué declara esas variables como T ?

 T HowToCast(T t) { if (typeof(T) == typeof(string)) { var newT1 = "some text"; var newT2 = t; //this builds but I'm not sure what it does under the hood. var newT3 = t.ToString(); //for sure the string you want. } return t; } 

También recibirá este error si tiene una statement genérica para su clase y su método. Por ejemplo, el código que se muestra a continuación proporciona este error de comstackción.

 public class Foo  { T var; public  void doSomething(Class  cls) throws InstantiationException, IllegalAccessException { this.var = cls.newInstance(); } } 

Este código se comstack (nota T eliminado de la statement del método):

 public class Foo  { T var; public void doSomething(Class  cls) throws InstantiationException, IllegalAccessException { this.var = cls.newInstance(); } } 

Cambiar esta línea:

 if (typeof(T) == typeof(string)) 

Para esta línea:

 if (t.GetType() == typeof(string))