Impossible de convertir implicitement le type 'Int' à 'T'
Je peux appeler Get<int>(Stat);
ou Get<string>(Name);
Mais lors de la compilation j'obtiens:
Impossible de convertir implicitement le type 'int' à 'T'
et la même chose pour string
.
public T Get<T>(Stats type) where T : IConvertible
{
if (typeof(T) == typeof(int))
{
int t = Convert.ToInt16(PlayerStats[type]);
return t;
}
if (typeof(T) == typeof(string))
{
string t = PlayerStats[type].ToString();
return t;
}
}
- Vous pensez probablement que si le bloc vérifié que T est de type int, donc à l'intérieur du bloc, tu sais que T est de type int et vous devriez être en mesure de convertir implicitement int à T. Mais le compilateur n'est pas conçu pour suivre ce raisonnement, il sait juste que, généralement, les T ne provient pas de l'int, afin de ne pas permettre la conversion implicite. (Et si le compilateur pris en charge, le vérificateur ne serait pas, si l'assembly compilé serait invérifiable.)
Vous devez vous connecter pour publier un commentaire.
Tout temps, vous trouvez vous-même d'allumer un type générique, vous êtes presque certainement fait quelque chose de mal. Les génériques doivent être générique; ils doivent fonctionner à l'identique totalement indépendante du type.
Si T ne peut être de type int ou string, puis ne pas écrire votre code de cette façon à tous, en premier lieu. Écrire deux méthodes, l'une qui renvoie un int et qui retourne une chaîne de caractères.
int, int?, bool, bool?, string
, et il était apparemment impossible.Vous devriez être en mesure de l'utiliser juste
Convertir.ChangeType()
à la place de votre code personnalisé:return (T)(object)PlayerStats[type];
return (T) t;
car pas de nulle vérifications sont nécessaires.ChangeType
est probablement votre meilleure option. Ma solution est similaire à celle prévue par BrokenGlass avec un peu de try catch logique.Essayez ceci:
Considérant @BrokenGlass logique (
Convert.ChangeType
) ne prend pas en charge pour le type de GUID.Erreur: Invalid cast de 'Système.Chaîne' de 'Système.Guid'.
Au lieu de cela, utiliser en dessous de la logique à l'aide de
TypeDescriptor.GetConverter
en ajoutantSystem.ComponentModel
espace de noms.Lire cette.
En fait, vous pouvez simplement convertir
object
puis àT
.T var = (T)(object)42;
Un exemple pour
bool
:Parfois, ce comportement est souhaitable. Par exemple, lors de l'application ou du remplacement d'une méthode générique d'une classe de base ou de l'interface et vous souhaitez ajouter des fonctionnalités différentes en fonction sur le
T
type.Il semble que vous ayez besoin d'un
TypeConverter
, voir cette entrée de blog.Vous pouvez tout simplement jeté comme ci-dessous,