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();
}
}