tag propiedad c# .net generics casting

c# - propiedad - El valor del tipo ''T'' no se puede convertir a



propiedad tag de un textbox (5)

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

Tengo este método bastante artificial

T HowToCast<T>(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 compila 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 sintaxis incorrecta. Por favor, ayúdame a resolverlo.

¡Gracias!


Ambas líneas tienen el mismo problema

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

El compilador 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


Aunque está dentro de un bloque if , el compilador 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;


Cambiar esta línea:

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

Para esta línea:

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


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

T HowToCast<T>(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 declaración genérica para su clase y su método. Por ejemplo, el código que se muestra a continuación proporciona este error de compilación.

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

Este código se compila (nota T eliminado de la declaración del método):

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