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